当我将模型从ViewController传输到ViewController时,我应该使用强指针吗?

时间:2012-08-16 13:35:24

标签: objective-c ios automatic-ref-counting

假设我有一个显示“Pizzas”图片的应用程序。假设我的应用程序的模型只是一个包含9个不同比萨饼的UIImages的数组。

@property (nonatomic) NSArray *myPizzas;

在名为FirstViewController的第一个视图控制器中创建数组。此视图控制器还显示前3个披萨图像。当用户点击屏幕上的按钮时,该披萨阵列被转移到第二个视图控制器(SecondViewController),该控制器显示接下来的3个披萨。最后,当用户点击屏幕上的最后一个按钮时,阵列将被传输到最终视图控制器(ThirdViewController),该控制器显示最后三个比萨饼。

假设这是应用程序所做的全部操作,并且每次新的视图控制器被缝合时,都会将其推送到导航控制器堆栈。

我的问题是,如果每个视图控制器都有一个strong对数组的引用,或者应该只有第一个具有strong引用,并且最后两个视图控制器具有weak参考?最重要的是,为什么会出现这种情况?

3 个答案:

答案 0 :(得分:4)

@property (nonatomic, copy) NSArray * myPizzas;

你读得对 - 复制。如果类型是可复制的,copy(几乎)总是正确的选择 - 特别是当类型是不可变的时。

如果类型是不采用NSCopying的类型,那么您可以选择strong

使用weak引用没有任何好处或需要。弱引用使程序对象的语义和所有权变得复杂。在这里使用弱是完全没必要的。机会很好,弱指针只会导致随着时间的推移增加维护。因此,您可以通过使用强引用来避免复杂化。

答案 1 :(得分:1)

没关系,你可以去任何一种方式。您需要至少有一个强引用,并且两个选项都提供它。如果你使用强引用,保留/释放消息的数量会增加,但是这个的机制对你来说是隐藏的,所以你不会注意到任何东西。

有一个替代选择,根本不涉及引用:使您的模型myPizzas数组成为单例,并根据需要从控制器访问它。这样您就不需要将其传递给链中的下一个控制器。

答案 2 :(得分:1)

实际上,dasblinkenlight是正确的。只要您有一个强引用,您的数组就会持续存在。单身人士也会工作 - 但我尽量避免使用它们来传递数据。

然而,您将看到的最常见的模式是将属性作为强引用(尽管在您的特定示例中,应该复制NSArray)。

强大的参考,因为它保留了封装。您的控制器不依赖于某个其他对象负责维护强引用的环境。