【问题标题】:ios - ivar is null inside a block, although set before block executionios - ivar 在块内为空,尽管在块执行之前设置
【发布时间】:2013-09-22 20:38:00
【问题描述】:

我有以下代码:

[GetUserData getUserDataWithBlock:^(UserData *userData, NSError *error)
              {
                  self.userData = userData;
              #1  self.userData.fbUser = user;
                  // Call REST API of server 'GetAllWords'
                  [GetAllWords getAllWordsWithBlock:^(NSSet *newWords, NSError *error)
                   {
                       [self saveAllWords:newWords];
                   #2  [self showRootView];
                   }];
              }];

问题是,self.userData 在 #1 中正确设置(并且不为空),但是当我到达 #2 时 - self.userData 变为空... Point #1 是我唯一设置self.userData 的地方。

【问题讨论】:

  • 这里涉及到 GCD 吗?如果是这样,请提供代码。

标签: ios block ivar


【解决方案1】:

如果userData 属性被定义为weak(特别是如果getAllWordsWithBlock 异步运行),我可以想象您描述的行为。

如果没有,我建议在底层变量上设置一个“监视”:

  • 在代码中的第 1 点(大概在第 2 点)设置断点并在调试器中启动应用程序;

  • 当调试器在您的第一个断点处停止时,通过右键单击(或 control-单击)“变量”中的变量,在支持您的 userData 属性的变量上添加一个监视查看并选择“Watch”(显然,此屏幕快照是一段不同的代码,但它说明了如何在 Xcode 中创建“watch”):

  • 点击继续按钮恢复执行:

  • 当您遇到监视断点时,有时您会盯着汇编程序,但您可以点击“退出”按钮,直到您到达您识别的代码点。

这有助于确定是什么在改变您的变量(如果不是简单的weak 属性问题)。

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多