1

我有多个视图控制器,它们强烈引用 NSObject 的子类。每个视图控制器都允许用户以某种方式改变这个对象,然后将该对象传递给下一个视图控制器。完成后,用户可以提交这些更改并使用 NSObject 子类的新实例重新开始该过程。我遇到的问题是堆栈上的一些视图控制器保留了对提交实例的引用。

我尝试过使用弱和 unsafe_unretained ,但这使得在视图控制器之间传递对象变得困难。

一旦提交,我基本上需要释放对象的一个​​实例,这样任何视图控制器对它的引用都将为零。但是,ARC 不允许显式调用 dealloc。

我可以使用 NSNotificationCenter 或使用委托来解决这个问题,但是有没有更清洁的方法呢?

任何见解将不胜感激。谢谢!

4

4 回答 4

3

retain在每个视图控制器处理对象时让它们成为对象是合理的。

当视图控制器 A 处理对象时,它会保留它。当它完成并将其传递给 B 时,B 保留它,然后 A 将自己对它的引用设置为 nil 以放弃对它的所有权。这个过程一直持续到最终的视图控制器提交对象,然后将它自己的引用设置为 nil,这应该会导致对象被释放。

于 2013-03-20T21:14:01.177 回答
2

模型对象(每个人都会改变的对象)应该归一个中央“模型”类所有。你可以把它传过去。它可以具有诸如currentRecord或类似的方法。这样,你所有的视图控制器要么对当前记录有一个弱引用,要么他们可以在每次需要时向模型询问它。视图控制器不应该“拥有”数据对象。

这意味着视图控制器可以使用 KVO 来观察何时currentRecord发生变化。它交替地为您提供一个可以在事情发生变化时提供通知的对象。您的模型对象还可以潜在地处理网络或磁盘访问(或者,您可以拥有一个单独的控制器,该控制器也利用模型并提供网络或磁盘访问)。这里的关键是 MVC。您想将模型类与视图和控制器类分开。

于 2013-03-20T21:13:46.307 回答
1

一旦提交,您只需将对象设置为nil. ARC 会自动释放它。

于 2013-03-20T21:11:24.030 回答
0

您可以在视图控制器中覆盖 dealloc 方法并将对象设置为 nil 。因此,当您的视图控制器的实例超出范围时,会调用 dealloc 并且对象将设置为 nil。不要调用 [super dealloc] 。

于 2013-03-20T21:11:57.777 回答