我们如何声明一个全局(私有实例变量)来接受其中的块。我们需要合成它吗?什么是内存管理含义。
我有一个从第三方方法收到的块,我想保存在实例变量&在以后阶段使用它。
答案 0 :(得分:12)
这是一个(ARC-less)示例,用于在后台执行某些工作后为完成回调存储块:
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
答案 1 :(得分:2)
您可以使用C函数复制和释放块:
Block_copy(); Block_release();
如果您使用的是Objective-C,则可以发送阻止
copy
,retain
和release
(和autorelease
)消息。为避免内存泄漏,您必须始终平衡
Block_copy()
和Block_release()
。您必须将copy
或retain
与release
(或autorelease
)进行平衡 - 除非在垃圾收集环境中。