我有一个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
,并且实际上可能晚于此代码。那将是问题所在。您需要整理线程和事件顺序。