我正在尝试将块存储在项目中的实例变量中。这是我声明实例变量的地方:
@property (nonatomic, copy)void (^loginCompletedTask)();
我通过调用此方法来分配变量:
- (void)requireLoggedInForBlock:(void (^)())completion {
self.loginCompletedTask = completion;
// Display an alert view that requires username and password input
}
在此方法的第一行之后,self.loginCompletedTask
为非零,并使用类型NSMallocBlock
登录调试器。但是,当我确实需要在返回登录警报视图后运行块时,它已变为零。
我试过了:
strong
代替copy
,self.loginCompletedTask = ^{completion();};
,_loginCompletedTask = ...
)。我错过了什么?
答案 0 :(得分:1)
块是在堆栈而不是堆上创建的唯一对象(迄今为止)。如果要保持块的周期长于创建它的堆栈帧的生命周期,则必须copy
块(复制是基于堆的)。即使使用强指针也不会阻止块在弹出堆栈帧时消失。
ADDED:评论是正确的,具有复制属性就足够了。我的不好,我忘了复制属性了。
答案 1 :(得分:1)
原来它与错误地存储块无关。我实际上创建了一个与存储块相同的类的新对象,但忘记复制实际的块。因此,记录了self.loginCompletedBlock
值的被击中的方法正被另一个对象接收,而不是分配变量开始的对象。
感谢所有人的帮助,我总是惊讶于SO用户如此乐意提供帮助。