Iphone 在实例变量中保存块

Iphone 在实例变量中保存块,iphone,objective-c,ios,cocoa-touch,objective-c-blocks,Iphone,Objective C,Ios,Cocoa Touch,Objective C Blocks,我们如何声明一个全局(私有实例变量)来接受其中的一个块。我们是否需要综合它&它对内存管理的影响是什么 我从第三方方法收到一个块,我想将其保存在实例变量中,并在以后使用。请参阅: 可以使用C函数复制和释放块: Block_copy(); Block_release(); 如果您使用的是Objective-C,则可以发送块复制、保留、和释放(和自动释放)消息 为了避免内存泄漏,您必须始终平衡块复制()和块释放()。您必须在复制或保留与发布(或自动释放)之间取得平衡-除非在垃圾收集环境中 下面是一个

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

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

请参阅:

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

Block_copy();
Block_release();
如果您使用的是Objective-C,则可以发送块
复制
保留
、和
释放
(和
自动释放
)消息

为了避免内存泄漏,您必须始终平衡
块复制()
块释放()
。您必须在
复制
保留
发布
(或
自动释放
)之间取得平衡-除非在垃圾收集环境中

下面是一个(无弧)示例,在后台完成一些工作后,为完成回调存储一个块:

工人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

这很好。在同一个控制器类中,我希望保存在一个方法中收到的块,以便稍后在另一个方法中使用它。我该怎么做呢。我想在某个实例变量上保存块,然后稍后再使用。在ARC环境中,您也不能使用
保留
释放
自动释放
。请参阅和了解您是否在使用ARC。