我们如何声明一个全局(私有实例变量)来接受其中的一个块。我们是否需要综合它以及它对内存管理的影响是什么。
我从第三方方法收到了一个块,我想将其保存在实例变量中并在以后使用它。
我们如何声明一个全局(私有实例变量)来接受其中的一个块。我们是否需要综合它以及它对内存管理的影响是什么。
我从第三方方法收到了一个块,我想将其保存在实例变量中并在以后使用它。
这是在后台完成一些工作后为完成回调存储块的(ARC-less)示例:
工人.h:
@interface Worker : NSObject
{
void (^completion)(void);
}
@property(nonatomic,copy) void (^completion)(void);
- (void)workInBackground;
@end
工人.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
您可以使用 C 函数复制和释放块:
Block_copy(); Block_release();
如果你使用的是 Objective-C,你可以发送一个 block
copy
、retain
和release
(andautorelease
) 消息。为避免内存泄漏,您必须始终平衡 a
Block_copy()
与Block_release()
. 您必须平衡copy
orretain
与release
(orautorelease
) — 除非在垃圾收集环境中。