在实例变量中保存块

时间:2012-04-27 01:13:56

标签: iphone objective-c ios cocoa-touch objective-c-blocks

我们如何声明一个全局(私有实例变量)来接受其中的块。我们需要合成它吗?什么是内存管理含义。

我有一个从第三方方法收到的块,我想保存在实例变量&在以后阶段使用它。

2 个答案:

答案 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)

请参阅Blocks Programming Topics

  

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

Block_copy();
Block_release();
     

如果您使用的是Objective-C,则可以发送阻止copyretainrelease(和autorelease)消息。

     

为避免内存泄漏,您必须始终平衡Block_copy()Block_release()。您必须将copyretainrelease(或autorelease)进行平衡 - 除非在垃圾收集环境中。