ios - 虽然在块执行之前设置,但是块内的ivar是空的

时间:2013-09-22 20:38:01

标签: ios block ivar

我有以下代码:

[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变为空... 点#1是我设置self.userData的唯一地方。

1 个答案:

答案 0 :(得分:2)

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

如果没有,我建议在基础变量上设置“监视”:

  • 在代码中设置一个断点#(在大概#2点),并在调试器中启动应用程序;

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

    add watch

  • 点击继续按钮继续执行:enter image description here

  • 当你点击一个监视断点时,有时你会盯着汇编程序,但是你可以点击“跳出”按钮enter image description here,直到找到你认可的代码中的某个点。 / p>

这有助于识别变量的变化(如果不是简单的weak属性问题)。