Je voudrais stocker le bloc objective-c dans une propriété pour une utilisation ultérieure. Je ne savais pas trop comment le faire, alors j'ai fait une petite recherche sur Google et il y a très peu d'informations sur le sujet. Mais j'ai finalement réussi à trouver la solution et j'ai pensé que cela pourrait valoir la peine d'être partagé pour d'autres débutants comme moi.
Au départ, j'ai pensé que j'aurais besoin d'écrire les propriétés à la main pour utiliser Block_copy & Block_release.
Heureusement, j'ai découvert que les blocs sont des NSObjects et - copy
/- release
Est équivalent à Block_copy
/Block_release
. Je peux donc utiliser @property (copy)
pour générer automatiquement des setters et des getters.
Modifier: mis à jour pour ARC
typedef void(^MyCustomBlock)(void);
@interface MyClass : NSObject
@property (nonatomic, copy) MyCustomBlock customBlock;
@end
@implementation MyClass
@end
MyClass * c = [[MyClass alloc] init];
c.customBlock = ^{
NSLog(@"hello.....");
}
c.customBlock();
Alternativement, sans le typedef
@property (copy, nonatomic) void (^selectionHandler) (NSDictionary*) ;
Vous pouvez trouver une très bonne explication à ce sujet dans la session 712 de la WWDC 2012 à partir de la page 83. La manière correcte d'enregistrer un bloc sous ARC est la suivante:
@property(strong) my_block_type work;
Soyez prudent avec les cycles de rétention. Un bon moyen de résoudre est de mettre le bloc à zéro lorsque vous n'en avez plus besoin:
self.work = nil;