web-dev-qa-db-fra.com

Comment stocker des blocs dans des propriétés dans Objective-C?

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.

76
Piotr Czapla

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();
135
Dave DeLong

Alternativement, sans le typedef

@property (copy, nonatomic) void (^selectionHandler) (NSDictionary*) ;

98
Steven Kramer

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;
9
Jorge Perez