将一个块保存在实例变量中

3
我们如何声明一个全局的(私有实例变量)以接受其中的块。我们需要合成它吗?与此相关的内存管理问题是什么。
我从第三方方法中收到了一个块,我想将其保存在实例变量中并在以后使用它。
2个回答

12

这里是一个没有使用ARC的例子,演示了在后台进行一些工作后将块存储为完成回调的方式:

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

2
请参考Blocks编程主题:

You can copy and release blocks using C functions:

Block_copy();
Block_release();

If you are using Objective-C, you can send a block copy, retain, and release (and autorelease) messages.

To avoid a memory leak, you must always balance a Block_copy() with Block_release(). You must balance copy or retain with release (or autorelease)—unless in a garbage-collected environment.


这很好。在同一个控制器类中,我想保存在一个方法中接收到的块,以便稍后在另一个方法中使用它。我该怎么做呢?我考虑将块保存在某个实例变量上,然后稍后再使用它。 - Abhinav
在 ARC 环境中,您也不能使用 retainreleaseautorelease - Abizern
如果您正在使用ARC,请参考https://dev59.com/G13Va4cB1Zd3GeqPEuNj和https://dev59.com/7GHVa4cB1Zd3GeqPnoVo。 - Hailei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接