2012-06-06 2 views
3

Я не могу понять, как сделать это без использования определений типов:блока, который возвращает блок без ЬурейиХ


typedef void(^HLBlock)(void); 

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

    genBlock(10); 
} 

Это кажется довольно глупо, что мне нужно объявить HLBlock как ЬурейаЯ для пустоты (^) (void), но для жизни меня я не могу понять, как это сделать без typedef. Каков правильный тип возврата genBlock?

Спасибо! Джейми

+2

Если вы не в АРК вам необходимо скопировать этот блок при возвращении его. –

+0

@ KevinBallard, конечно, но должно быть ясно, что я прошу, я надеюсь. – jpswain

+2

Как вы знаете, 'dispatch_block_t' уже является typedef для' void (^) (void) '. –

ответ

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

Это простейший синтаксис. Вам нужно тщательно подумать, как синтаксис указателя функции действительно работает, чтобы понять его. Следуйте указаниям Кевина для исследования. И посмотрите превосходную запись Мэтта Галлахера: http://cocoawithlove.com/2009/10/ugly-side-of-blocks-explicit.html –

Смежные вопросы