0

我有 2 节课:

A类:

NSNotification以姓名注册为观察员notificationName

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

私有实例变量 -block1 _block1_obj;

然后有2个这样的方法:

- (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_objdoSomethingWithCompletionHandler

但是一段时间后,当控制权进入 notificationHandler: _block1_objnil

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

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

4

2 回答 2

0

您需要将块从堆栈复制到堆。如果您不使用它,则如果声明复制块是不够的,而是直接分配 ivar 而不使用复制。

于 2013-01-31T06:22:55.277 回答
-1

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

我建议您在.m文件中使用私有属性,如下所示:

@interface YourClass ()

@property (strong, nonatomic) block1 block1_obj;

@end

@implementation YourClass

@end

然后使用访问器分配块:

self.block1_obj = handlerBlock;
于 2013-01-30T13:03:31.660 回答