Objective c 在将模型从ViewController传输到ViewController时,是否应该使用强指针?
假设我有一个显示“比萨饼”图片的应用程序。假设我的应用程序的模型只是一个数组,其中包含9个不同比萨饼的UIImageObjective c 在将模型从ViewController传输到ViewController时,是否应该使用强指针?,objective-c,ios,automatic-ref-counting,Objective C,Ios,Automatic Ref Counting,假设我有一个显示“比萨饼”图片的应用程序。假设我的应用程序的模型只是一个数组,其中包含9个不同比萨饼的UIImage @property (nonatomic) NSArray *myPizzas; 阵列是在名为FirstViewController的第一个视图控制器中创建的。此视图控制器还显示前3个比萨饼图像。当用户点击屏幕上的一个按钮时,该比萨饼阵列被传输到第二个视图控制器(SecondViewController),该控制器显示接下来的3个比萨饼。最后,当用户点击屏幕上的最后一个按钮时,
@property (nonatomic) NSArray *myPizzas;
阵列是在名为FirstViewController
的第一个视图控制器中创建的。此视图控制器还显示前3个比萨饼图像。当用户点击屏幕上的一个按钮时,该比萨饼阵列被传输到第二个视图控制器(SecondViewController
),该控制器显示接下来的3个比萨饼。最后,当用户点击屏幕上的最后一个按钮时,阵列被传输到最终视图控制器(ThirdViewController
),该控制器显示最后三个比萨饼
假设这是应用程序所做的全部工作,并且每次将新的视图控制器分段到时,它都会被推送到导航控制器堆栈上
我的问题是,是否每个视图控制器都有一个对数组的
strong
引用,还是应该只有第一个视图控制器有strong
引用,而最后两个视图控制器有一个弱
引用?最重要的是,为什么会出现这种情况?没关系,你可以选择任何一种方式。您需要至少有一个强引用,并且两个选项都提供了它。如果您使用强引用,保留/发布消息的数量将增加,但其机制对您是隐藏的,因此您不会注意到任何事情
还有一种完全不涉及引用的替代选择:将带有
myPizzas
数组的模型设置为单例,并根据需要从控制器访问它。这样,您就不需要将其传递给链中的下一个控制器。这没关系,您可以选择任何一种方式。您需要至少有一个强引用,并且两个选项都提供了它。如果您使用强引用,保留/发布消息的数量将增加,但其机制对您是隐藏的,因此您不会注意到任何事情
@property (nonatomic, copy) NSArray * myPizzas;
还有一种完全不涉及引用的替代选择:将带有myPizzas
数组的模型设置为单例,并根据需要从控制器访问它。这样,您就不需要将其传递给链中的下一个控制器
@property (nonatomic, copy) NSArray * myPizzas;
你读对了,收到。如果类型是可复制的,copy
几乎总是正确的选择——特别是当类型是不可变的时
如果类型是不采用NSCopying
的类型,则您将选择strong
使用弱
引用没有任何好处或必要。弱引用使程序对象的语义和所有权复杂化。在这里使用弱电是完全没有必要的。弱指针很可能只会随着时间的推移导致维护增加。因此,您可以通过使用强引用来避免复杂性
你读对了,收到。如果类型是可复制的,copy
几乎总是正确的选择——特别是当类型是不可变的时
如果类型是不采用NSCopying
的类型,则您将选择strong
使用
弱
引用没有任何好处或必要。弱引用使程序对象的语义和所有权复杂化。在这里使用弱电是完全没有必要的。弱指针很可能只会随着时间的推移导致维护增加。因此,您可以通过使用强引用来避免复杂性。实际上,dasblinkenlight是正确的。只要您有一个强引用,您的数组就会持续存在。一个单例也可以工作,但我尽量避免仅仅为了传递数据而使用它们
然而,您将看到的最常见的模式是将属性作为强引用(尽管在您的特定示例中,NSArray应该是copy)
强引用,因为它保留了封装。您的控制器不依赖于处于某个其他对象负责维护强引用的环境中。实际上,dasblinkenlight是正确的。只要您有一个强引用,您的数组就会持续存在。一个单例也可以工作,但我尽量避免仅仅为了传递数据而使用它们 然而,您将看到的最常见的模式是将属性作为强引用(尽管在您的特定示例中,NSArray应该是copy)
强引用,因为它保留了封装。您的控制器不依赖于其他对象负责维护强引用的环境。根据上述答案,如果您需要在多个视图控制器之间共享数据,我绝对建议使用单例方法假设单例方法不适用于我的应用程序,从广义上讲,如果我将数据传递给的每个视图控制器都有一个指向它的强指针,那么不会有内存泄漏吗?所以,如果我只是在视图控制器之间传递数据,那么让它们都有强指针是安全的吗?@Joey Franklin是的,有强指针是安全的。一旦控制器本身被释放,ARC将负责释放您的
myPizzas
阵列;一旦引用计数为零,对象将被解除分配,从而防止内存泄漏。他可以走任何一条路,但在实践中,最好在任何地方使用strong,除非您试图避免保留周期。这样你就不必跟踪哪个对象具有强引用,也不必确保它不会意外消失。而且,尽可能避免使用单例。根据上面的答案,如果您需要在多个视图控制器之间共享数据(假设单例对我的应用程序不可行),我肯定会推荐使用单例方法,并且