【发布时间】:2023-04-11 04:47:02
【问题描述】:
这是一个简单得令人尴尬的问题,但我需要保留一个视图控制器,而我目前的解决方案不是解决方案。
我有一个滑出的表格视图菜单,让我可以选择一个新的视图控制器来推到最前面。当我选择一个视图时,它会释放旧的主视图控制器以推送新的主视图控制器。由于我 90% 的功能都围绕一个视图控制器,我希望它保留在内存中,这样我就不必经常花费资源来分配它,也不必从核心数据中提取最后一个数据源或发出网络请求。
我天真地尝试设置一个占位符 temporaryMainViewController 并将其分配给我的中心视图控制器,然后再分配另一个 VC,但是将当前主视图控制器分配给 temporaryMainViewController 只是分配主视图控制器的地址-所以当它改变时,我的 tempVC 也是如此。
尝试copy 视图控制器会导致崩溃。
那么我怎样才能有效地做到self.temporaryMainViewController = self.currentCenterViewController;,其中临时控制器是由对象的值而不是地址的值分配的?
-- 编辑-- 更多信息:
ECSlidingViewController 在内存中保留(在我的情况下)3 个控制器——顶部/中心/主视图控制器、左隐藏控制器和右隐藏控制器。我的左侧隐藏控制器是一个表视图 LeftMenuTableViewController ,其中每一行在被选中时都会观察我与该 indexPath 关联的视图控制器类,然后实例化该类的一个实例并使用简单的赋值语句将其设置为 topViewController。当一个新的视图控制器分配给顶视图时,我只想在内存中保留我的 initial 顶视图控制器(属于 PlacesNavigationViewController 类(包含 PlacesTableViewController))。
我的第一种方法是在 LeftMenuTableViewController 中声明一个占位符属性,因为它本身永远不会离开内存。
@property (nonatomic, strong) UIViewController* temporaryViewController;
然后在didSelectRowAtIndexPath:
// make local variables for storyboard and the identifier of the view controller that will be pushed, then..
self.temporaryViewController = self.topViewController;
self.topViewController = [storyboard instantiateViewControllerWithIdentifier:newViewControllerIdentifier];
但这失败了,因为临时控制器被分配了 topViewController 的内存地址——在下一行中,它被赋予了一个新的视图控制器来保存。
所以我需要一种方法来保存topViewController 的内容,这样当topViewController 发生变化时,我的内存中仍然有旧的VC。
我可能忘记了 Objective-C 的一些明显原则,但这会带来很多麻烦。如果我没有说清楚,请告诉我。
【问题讨论】:
-
也许我错过了明显的,但为什么不保留它呢?
-
是的,
[vc retain]完成了这项工作。 (在 ARC 下等效:保留对它的strong引用。) -
我确实对它有强烈的参考。但是当我将一个新对象分配给顶视图控制器时,tempViewController 仍然指向 topVC 后面的内存地址中的任何内容。
-
您需要提供更多上下文和代码,以便人们能够帮助您。告诉我们您的控制器层次结构将是一件有用的事情。
-
我不知道 ECSlidingViewController 是否有问题,但是将temporaryVC 设置为self.topVC,然后将topVC 重新分配给另一个控制器,不应该让topVC 和temporaryVC 指向同一个东西。
标签: ios objective-c pass-by-value