iPhone sdk存储块参数供以后使用

时间:2013-01-30 12:36:53

标签: iphone automatic-ref-counting objective-c-blocks

我有2个班级:

A类:

注册为NSNotification的观察员,名称为notificationName

.h文件声明 - typedef void (^block1)(NSError *error);

私有实例变量 - block1 _block1_obj;

然后有两个这样的方法:

- (void) doSomethingWithCompletionHandler:(block1)handlerBlock
{
   _block1_obj = handlerBlock;    // Also tried _block1_obj = [handlerBlock copy];
   [classB_obj doAnotherThing];
}

- (void) notificationHandler:(NSNotification *)notification
{
   ...
   _block1_obj(error);
}

B组:

- (void) doAnotherThing
{
   ...
   [[NSNotificationCenter defaultCenter] postNotificationName:notificationName
                                                            object:nil
                                                          userInfo:dict];
}

现在我发现在调试时, 在_block1_obj

中为doSomethingWithCompletionHandler分配了一个值

但是在一段时间后,控制权来自notificationHandler: _block1_objnil

不知道为什么会这样。任何人都可以解释一下吗?

更新: 我也尝试使用copy属性创建一个属性,但它也不起作用。

2 个答案:

答案 0 :(得分:0)

您需要将块从堆栈复制到堆。如果不使用它,如果不足以声明副本块,则直接指定ivar而不复制。

答案 1 :(得分:-1)

您需要将实例变量声明为__strong,因此ARC将知道它必须保留该对象。

我建议您在.m文件中使用私有财产:

@interface YourClass ()

@property (strong, nonatomic) block1 block1_obj;

@end

@implementation YourClass

@end

然后使用访问者分配块:

self.block1_obj = handlerBlock;