在实例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,则可以发送块
copy
,retain
和release
(和autorelease
)消息。为了避免内存泄漏,您必须始终使用
Block_release()
来平衡Block_copy()
Block_release()
。 您必须平衡copy
或retain
与release
(或autorelease
) – 在垃圾收集环境中,除非。