我有多个视图控制器,它们强烈引用了NSObject的子类。每个视图控制器允许用户以某种方式改变该对象,然后将该对象传递给下一个视图控制器。完成后,用户可以提交这些更改并使用NSObject子类的新实例重新启动该过程。我遇到的问题是堆栈上的一些视图控制器保留了对已提交实例的引用。
我尝试过使用weak和unsafe_unretained,但这使得在视图控制器之间传递对象变得很困难。
我基本上需要在提交后解除对象的实例,因此任何视图控制器对它的引用都将为nil。但是,ARC不允许显式调用dealloc。
我可以使用NSNotificationCenter或使用委托来解决这个问题,但是有更简洁的方法吗?
非常感谢任何见解。谢谢!
答案 0 :(得分:3)
让每个视图控制器retain
在对象上工作时是合理的。
当视图控制器A正在处理对象时,它会保留它。当它完成并将它传递给B时,B保留它,然后A将它自己的引用设置为nil以重新签名它的所有权。这个过程一直持续到最终视图控制器提交对象,然后将它自己的引用设置为nil,这应该导致对象被释放。
答案 1 :(得分:2)
模型对象(每个人都变异的对象)应归中心“Model”类所有。你可以传递它。它可以有一个方法,如currentRecord
等。这样,所有视图控制器都可以对当前记录具有弱引用,或者他们可以在每次需要时向模型询问它。视图控制器永远不应该“拥有”数据对象。
这意味着视图控制器可以使用KVO观察currentRecord
何时发生变化。它交替地为您提供一个对象,可以在事情发生变化时提供通知。您的Model对象还可以处理网络或磁盘访问(或者,您可以使用单独的控制器,该控制器也使用Model并提供网络或磁盘访问)。这里的关键是MVC。您希望将模型类与视图和控制器类分开。
答案 2 :(得分:1)
一旦提交,您只需将对象设置为nil
即可。 ARC会自动释放它。
答案 3 :(得分:0)
您可以在视图控制器中覆盖dealloc方法,并将对象设置为nil。因此,当视图控制器的实例超出范围时,将调用dealloc并将对象设置为nil。不要叫[super dealloc]。