2012-06-06 23 views
3

我無法弄清楚如何做到這一點,而不使用的typedef:塊,返回塊沒有的typedef


typedef void(^HLBlock)(void); 

- (void)whatever 
{ 
    HLBlock (^genBlock)(int) = ^(int tryCount){ 
     HLBlock b1 = [[^{ 
      NSLog(@"tryCount=%i", tryCount); 
     } copy] autorelease]; 
     return b1; 
    }; 

    genBlock(10); 
} 

它似乎很愚蠢,我需要聲明HLBlock爲無效(^)一個typedef(無效),但對於我的生活,我無法弄清楚如何在沒有typedef的情況下做到這一點。 genBlock的正確返回類型是什麼?

謝謝! 傑米

+2

除非你在ARC是你需要恢復時,它來複制該塊。 –

+0

@KevinBallard當然,但它應該仍然清楚我問我希望。 – jpswain

+2

大家知道,'dispatch_block_t'已經是'void(^)(void)'的typedef。 –

回答

9

這裏是沒有類型定義的語法,但我認爲它是如此不可讀的類型定義是強烈的首選:

void(^(^genBlock)(int))() = ^(int tryCount){ 
    void (^b1)() = ^{ 
    NSLog(@"tryCount=%i", tryCount); 
    }; 
    return b1; 
}; 

void(^aBlock)() = genBlock(10); 
aBlock(); 
+2

這裏的cdecl描述:http://cdecl.ridiculousfish.com/?q=void%28%5E%28%5EgenBlock%29%28int%29%29%28%29 –

+0

@RobNapier這真的是最簡單的語法?爲什麼這不起作用:(void(^)(void))(^ genBlock)(int)= ^(int tryCount){...}我問b/c你寫的東西看起來不像它與我在本評論中給出的例子相比,可以使用typedef。 – jpswain

+1

這是最簡單的語法。您需要仔細思考函數指針語法是如何真正理解它的。按照Kevin的鏈接進行一些探索。看到馬特加拉格爾的優秀寫作:http://cocoawithlove.com/2009/10/ugly-side-of-blocks-explicit.html –

相關問題