弧。数组中的对象指向nil

时间:2015-01-09 17:05:23

标签: ios objective-c ios8 nsarray automatic-ref-counting

我有一个ViewController从CoreData获取对象,并使用UITableView构建它们。 当用户按行时,我获取报告对象并使用以下方法将其传递给下一个视图控制器:

Reportage *reportage = [self.reportages objectAtIndex:indexPath.row];
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
ReportageTeaserPanelViewController *rightController = (ReportageTeaserPanelViewController*)self.menuContainerViewController.rightMenuViewController;
rightController.reportage = reportage;
[self.menuContainerViewController toggleRightSideMenuCompletion:nil];

变量reportage在控制器ReportageTeaserPanelViewController中声明为strong。

问题如下。如果我必须异步重新加载父视图控制器数组中的对象,因为我的Web服务中有更新,则变量reportage在控制器ReportageTeaserPanelViewController中变为nil。我认为使用强引用,控制器ReportageTeaserPanelViewController应该保持" old"报告文件对象,虽然它从数组中消失。

这种行为的解释是什么?

由于

2 个答案:

答案 0 :(得分:1)

从我可以收集的内容开始,self.reportages不是nil,但由于它在初始加载后异步重新加载,当用户在异步重新加载期间选择表时,您将面临{{ 1}}为零或可能不完整。

为了防止使用nil值初始化本地self.reportages变量,我建议不要直接在父视图控制器的异步块中重新加载reportage数组,而是在其中创建本地数组然后,一旦该数组包含完整和正确的内容,设置self.reportages以包含该本地数组的内容。这样,只要您的网络服务返回正确的“报告文件”,self.reportages将永远不会等于零。

答案 1 :(得分:0)

  

我认为使用强引用,控制器ReportageTeaserPanelViewController应该保持" old"报道对象。

强烈的引用是无关紧要的。此代码中没有任何内容是"保持" - 这些都是本地的自动变量,因此一旦代码运行它们就会不再存在。只有持久性引用才能使对象持久化。实例变量/属性是持久引用的示例;它与实例本身一样长,除非你改变它的价值。所以要查看的地方是实例变量reportages

你在说:

Reportage *reportage = [self.reportages objectAtIndex:indexPath.row];

如果该索引处没有对象,则该索引处没有对象。它与强引用无关。你需要考虑reportages应该在哪里获得它的价值。

这听起来是因为你使用了“#34;异步”这个词。就像你可能在不同的线程上设置reportages,并且可能实际上晚于此代码正在运行。那就是问题所在。您需要整理出线程和事件顺序。