1

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

@property (nonatomic) NSArray *myPizzas;

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

假设这就是应用程序所做的所有事情,并且每次新的视图控制器被连接到时,它都会被推送到导航控制器堆栈上。

我的问题是,每个视图控制器都strong应该引用数组还是应该只有第一个有strong引用,最后两个视图控制器有weak引用?最重要的是,为什么会这样?

4

3 回答 3

4
@property (nonatomic, copy) NSArray * myPizzas;

你没看错——复制。如果类型是可复制的,那么copy(几乎)总是正确的选择——尤其是当类型是不可变的时。

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

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

于 2012-08-16T13:52:00.700 回答
1

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

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

于 2012-08-16T13:42:47.007 回答
1

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

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

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

于 2012-08-16T13:52:03.463 回答