3

我们如何声明一个全局(私有实例变量)来接受其中的一个块。我们是否需要综合它以及它对内存管理的影响是什么。

我从第三方方法收到了一个块,我想将其保存在实例变量中并在以后使用它。

4

2 回答 2

12

这是在后台完成一些工作后为完成回调存储块的(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
于 2012-04-27T02:55:18.347 回答
2

请参考Blocks Programming Topics

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

Block_copy();
Block_release();

如果你使用的是 Objective-C,你可以发送一个 block copyretainrelease(and autorelease) 消息。

为避免内存泄漏,您必须始终平衡 aBlock_copy()Block_release(). 您必须平衡copyorretainrelease(or autorelease) — 除非在垃圾收集环境中。

于 2012-04-27T01:17:39.313 回答