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];
}
@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? –
@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
'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. –