我有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_obj
为nil
。
不知道为什么会这样。任何人都可以解释一下吗?
更新:
我也尝试使用copy
属性创建一个属性,但它也不起作用。
答案 0 :(得分:0)
您需要将块从堆栈复制到堆。如果不使用它,如果不足以声明副本块,则直接指定ivar而不复制。
答案 1 :(得分:-1)
您需要将实例变量声明为__strong
,因此ARC
将知道它必须保留该对象。
我建议您在.m
文件中使用私有财产:
@interface YourClass ()
@property (strong, nonatomic) block1 block1_obj;
@end
@implementation YourClass
@end
然后使用访问者分配块:
self.block1_obj = handlerBlock;