弧。数组中的对象指向 nil
ARC. Object from array points to 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];
变量 reportage 在控制器中声明为 strong ReportageTeaserPanelViewController
。
问题如下。如果我必须异步重新加载父视图控制器数组中的对象,因为我的 Web 服务中有更新,则变量 reportage 在控制器 ReportageTeaserPanelViewController 中变为 nil。我认为使用强引用,控制器 ReportageTeaserPanelViewController 应该保留 "old" 报告文学对象,尽管它从数组中消失了。
对这种行为有什么解释吗?
谢谢
I thought that using a strong reference, the controller ReportageTeaserPanelViewController should be keep the "old" reportage object.
强引用无关紧要。此代码中没有任何内容是 "kept" - 这些都是本地自动变量,因此一旦代码运行它们就会消失。只有 persistent 引用才能使对象持久化。实例变量 /属性 是持久引用的一个例子;它与实例本身一样长,除非您当然更改它的值。所以要看的地方是你的实例变量,reportages
.
您是说:
Reportage *reportage = [self.reportages objectAtIndex:indexPath.row];
如果该索引处没有对象,则该索引处没有对象。它与强引用无关。你需要考虑 reportages
应该在哪里获得它的价值。
从您对 "asynchronously" 这个词的使用听起来好像您可能在与此代码 运行 不同的线程上设置 reportages
,实际上可能晚于此代码。这就是问题所在。您需要整理好线程和事件顺序。
据我所知,你开始时 self.reportages
不是零,但由于它在初始加载后异步重新加载,当用户在异步重新加载期间选择 table 时,你'我们有 self.reportages
为零或可能不完整的危险。
为了防止用 nil 值初始化本地 reportage
变量,我建议不要直接在父视图控制器的异步块中重新加载 self.reportages
数组,而是创建本地该块中的数组,然后,一旦该数组包含完整且正确的内容,设置 self.reportages
以包含该本地数组的内容。这样,只要您的网络服务 returns 正确 "reportage," self.reportages
永远不会等于 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];
变量 reportage 在控制器中声明为 strong ReportageTeaserPanelViewController
。
问题如下。如果我必须异步重新加载父视图控制器数组中的对象,因为我的 Web 服务中有更新,则变量 reportage 在控制器 ReportageTeaserPanelViewController 中变为 nil。我认为使用强引用,控制器 ReportageTeaserPanelViewController 应该保留 "old" 报告文学对象,尽管它从数组中消失了。
对这种行为有什么解释吗?
谢谢
I thought that using a strong reference, the controller ReportageTeaserPanelViewController should be keep the "old" reportage object.
强引用无关紧要。此代码中没有任何内容是 "kept" - 这些都是本地自动变量,因此一旦代码运行它们就会消失。只有 persistent 引用才能使对象持久化。实例变量 /属性 是持久引用的一个例子;它与实例本身一样长,除非您当然更改它的值。所以要看的地方是你的实例变量,reportages
.
您是说:
Reportage *reportage = [self.reportages objectAtIndex:indexPath.row];
如果该索引处没有对象,则该索引处没有对象。它与强引用无关。你需要考虑 reportages
应该在哪里获得它的价值。
从您对 "asynchronously" 这个词的使用听起来好像您可能在与此代码 运行 不同的线程上设置 reportages
,实际上可能晚于此代码。这就是问题所在。您需要整理好线程和事件顺序。
据我所知,你开始时 self.reportages
不是零,但由于它在初始加载后异步重新加载,当用户在异步重新加载期间选择 table 时,你'我们有 self.reportages
为零或可能不完整的危险。
为了防止用 nil 值初始化本地 reportage
变量,我建议不要直接在父视图控制器的异步块中重新加载 self.reportages
数组,而是创建本地该块中的数组,然后,一旦该数组包含完整且正确的内容,设置 self.reportages
以包含该本地数组的内容。这样,只要您的网络服务 returns 正确 "reportage," self.reportages
永远不会等于 nil。