Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在将模型从ViewController传输到ViewController时,是否应该使用强指针?_Objective C_Ios_Automatic Ref Counting - Fatal编程技术网

Objective c 在将模型从ViewController传输到ViewController时,是否应该使用强指针?

Objective 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个比萨饼。最后,当用户点击屏幕上的最后一个按钮时,

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

@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,除非您试图避免保留周期。这样你就不必跟踪哪个对象具有强引用,也不必确保它不会意外消失。而且,尽可能避免使用单例。根据上面的答案,如果您需要在多个视图控制器之间共享数据(假设单例对我的应用程序不可行),我肯定会推荐使用单例方法,并且