存储为实例变量的块变为nil

时间:2013-08-19 14:58:26

标签: ios objective-c block

我正在尝试将块存储在项目中的实例变量中。这是我声明实例变量的地方:

@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 = ...)。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

块是在堆栈而不是堆上创建的唯一对象(迄今为止)。如果要保持块的周期长于创建它的堆栈帧的生命周期,则必须copy块(复制是基于堆的)。即使使用强指针也不会阻止块在弹出堆栈帧时消失。

ADDED:评论是正确的,具有复制属性就足够了。我的不好,我忘了复制属性了。

答案 1 :(得分:1)

原来它与错误地存储块无关。我实际上创建了一个与存储块相同的类的新对象,但忘记复制实际的块。因此,记录了self.loginCompletedBlock值的被击中的方法正被另一个对象接收,而不是分配变量开始的对象。

感谢所有人的帮助,我总是惊讶于SO用户如此乐意提供帮助。