76 votes

Comment stocker des blocs dans les propriétés de l'Objective-C?

Je voudrais stocker objective-c bloc de la propriété pour les utiliser plus tard. Je n'étais pas sûr de savoir comment faire donc je l'ai googlé un peu et il y a très peu d'info sur le sujet. Mais j'ai réussi à trouver la solution finalement et j'ai pensé qu'il pourrait être le partage de la valeur pour d'autres débutants comme moi.

Au départ, j'ai pensé que j'aurais besoin d'écrire les propriétés par la main pour l'utilisation Block_copy & Block_release.

Heureusement, j'ai trouvé que les blocs sont NSObjects et - copy/- release est équivalent à Block_copy/Block_release. Donc je peux l'utiliser @property (copy) pour générer automatiquement les setters et getters.

135voto

Dave DeLong Points 156978

Edit: mis à jour pour l'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();

98voto

Steven Kramer Points 6122

Sinon, sans le typedef

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

9voto

Jorge Perez Points 656

Vous pouvez trouver une très bonne explication de cette WWDC 2012 session 712 partir de la page 83. La bonne façon de sauver un bloc sous l'ARC est la suivante:

@property(strong) my_block_type work;

Soyez prudent avec les conserver cycles. Une bonne façon de résoudre est fixé le bloc à zéro lorsque vous n'en n'avez plus besoin:

self.work = nil;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X