2011-01-13 2 views
4

En ce qui concerne le code ci-dessous, une fois un bloc a été mis dans un tableau, comment pourriez-vous prendre cet objet bloc et exécuter le code réel dans le bloc.Objective-C blocs - utiliser comme un objet

Une autre question: Si j'appelle une méthode dans un bloc comme ci-dessous, est-ce que le code bloc encapsule dans cette méthode ou capturer la signature de la méthode et de l'appeler de cette façon?

-(void)blockCalledMethod 
{ 
    NSLog(@"Hello World"); 
} 

-(void)programStart 
{  

    NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];  

    id pointerToBlock = [array lastObject]; 
} 

Répondre

7

appel comme ceci:

void (^pointerToBlock)(void) = [array lastObject]; 
pointerToBlock(); // because^{} is void(^)(void) 

Vous ne pouvez pas déclarer pointerToBlock comme id si vous voulez l'appeler directement, parce que le compilateur doit le reconnaître comme un type de bloc et pas seulement un objet. Si j'appelle une méthode dans un bloc comme ci-dessus, ce bloc encapsule-t-il le code dans cette méthode ou capture-t-il la signature de la méthode et l'appelle ainsi? Je pense que self fait référence à la classe appelante.

+0

@BoltClock, je crois aussi que '^ {}' est pas la même chose que 'nil' de sorte que vous ne pouvez pas tester son existence comme ça, non? 'if (pointerToBlock)' est-il mauvais? Les blocs ne sont pas des sous-classes de NSObjects, bien qu'ils puissent être stockés dans des conteneurs et traités comme tels? –

+0

@Stephen Furlani: Je faisais référence à '^ {}' comme signature, mais oui, un bloc n'est pas le même que le bloc (nil). Pour votre deuxième question, j'ai essayé '[^ {} isKindOfClass: [classe NSObject]]' et (à ma grande surprise) il retourne 'YES'. – BoltClock

+1

'if (pointerToBlock)' devrait fonctionner correctement. En fait, si 'pointerToBlock' est NULL (même chose que nul), si vous le faites' pointerToBlock() 'vous écrasez, contrairement à la messagerie d'un objet nul, de sorte que vous aurez envie de faire cette vérification avant d'appeler un bloc si peut être NULL. –

Questions connexes