在实例variables中保存一个块

我们如何声明一个全局(私有实例variables)来接受一个块。 我们是否需要综合它,以及它的内存pipe理含义是什么?

我有一个从第三方收到的块,我想保存在实例variables中,并在稍后阶段使用它。

下面是一个在后台做一些工作后存储一个完成callback块的(无ARC)例子:

Worker.h:

@interface Worker : NSObject { void (^completion)(void); } @property(nonatomic,copy) void (^completion)(void); - (void)workInBackground; @end 

Worker.m:

 @implementation Worker @synthesize completion; - (void)dealloc { Block_release(completion); [super dealloc]; } - (void)setCompletion:(void (^)(void))block { if ( completion != NULL ) Block_release(completion); completion = Block_copy(block); } - (void)workInBackground { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { // Do work.. dispatch_async(dispatch_get_main_queue(), completion); }); } @end 

请参阅Blocks Programming Topics

您可以使用C函数复制和释放块:

 Block_copy(); Block_release(); 

如果您正在使用Objective-C,则可以发送块copyretainrelease (和autorelease )消息。

为了避免内存泄漏,您必须始终使用Block_release()来平衡Block_copy() Block_release() 。 您必须平衡copyretainrelease (或autorelease ) – 在垃圾收集环境中,除非。