弧.从数组指向 nil 的对象



我有一个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];

变量报告文学在控制器ReportageTeaserPanelViewController中声明为强。

问题如下。如果我由于 Web 服务中有更新而必须异步重新加载父视图控制器数组中的对象,则变量 reportage 在控制器 ReportageTeaserPanelViewController 中为 nil。我认为使用强引用,控制器ReportageTeaserPanelViewController应该保留"旧"报告文学对象,尽管它从数组中消失了。

这种行为有什么解释吗?

谢谢

据我所知,您一开始self.reportages不是 nil,但由于它在初始加载后异步重新加载,当用户在异步重新加载期间选择表时,您有self.reportages为零或可能不完整的危险。

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

我认为使用强引用,控制器ReportageTeaserPanelViewController应该保留"旧"报告文学对象。

强有力的参考是无关紧要的。此代码中的任何内容都没有被"保留" - 这些都是局部的自动变量,因此一旦代码运行,它们就会消失。只有持久引用才能使对象持久化。实例变量/属性是持久引用的一个示例;它的寿命与实例本身一样长,除非您当然更改其值。所以要看的地方是你的实例变量,reportages .

你是说:

Reportage *reportage = [self.reportages objectAtIndex:indexPath.row];
如果该索引上没有对象

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

从您使用"异步"一词听起来好像您可能在与正在运行的此代码不同的线程上设置reportages,并且实际上可能晚于此代码。那将是问题所在。您需要整理线程和事件顺序。

最新更新