Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
复制和引用NSIOS对象_Ios_Objective C_Arrays_Swift - Fatal编程技术网

复制和引用NSIOS对象

复制和引用NSIOS对象,ios,objective-c,arrays,swift,Ios,Objective C,Arrays,Swift,因此,有一段时间我一直在开发这个应用程序,其中包含一个类似文件夹的对象结构,这些对象的属性为数组,数组可以包含相同类型的对象,而数组又可以包含更多的对象,等等。这些对象称为组。在共享数据类中,我有一个名为mainGroup的主组对象和一个名为selectedGroup的数据类属性,以便于显示数据。这些组对象可以修改,因此在相当长的一段时间里,我试图开发一种解决方案,以获得通过所有数组到所需对象的路径,同时对复制没有任何线索,并且将一个数组指定为另一个数组并不会创建深度复制,只是某种引用。代码在逻

因此,有一段时间我一直在开发这个应用程序,其中包含一个类似文件夹的对象结构,这些对象的属性为数组,数组可以包含相同类型的对象,而数组又可以包含更多的对象,等等。这些对象称为组。在共享数据类中,我有一个名为mainGroup的主组对象和一个名为selectedGroup的数据类属性,以便于显示数据。这些组对象可以修改,因此在相当长的一段时间里,我试图开发一种解决方案,以获得通过所有数组到所需对象的路径,同时对复制没有任何线索,并且将一个数组指定为另一个数组并不会创建深度复制,只是某种引用。代码在逻辑上是合理的,但过了一段时间,我注意到删除selectedGroup的数组属性中的内容对实际的主副本有相同的影响,这对我的应用程序造成了一些不稳定的影响


我在谷歌上搜索了一下,发现我实际上并没有创建一个全新的数组,只是以某种方式引用了它。不过,我对下一部分仍然感到困惑。我认为将一个数组设置为另一个数组会产生与对其调用copy相同的效果,并且当我替换或删除一个数组中的对象时,另一个数组会受到影响。那么,当您将两个数组设置为彼此相等时,编译器到底在做什么呢?它不应该仅仅用指向旧数组中对象的指针填充新数组,而不仅仅引用数组本身吗?为什么在对NSStrings这样的对象执行相同的操作时,您看不到相同的效果?最后,还有哪些对象具有与nsarray相同的行为?

您的问题在于,这就是对象的工作方式。每当您使用一个对象时,它都会传递对前一个对象的引用,而不是复制它并创建一个新的对象,而NSArray本身就是对象。如果你想按照你在问题中所说的去做,你需要创建一个新的数组,遍历数组中的每个对象,并将其复制到新的数组中。如果您使用的是objective-c,那么您没有任何其他与此功能相关的功能,尽管您可以查看NSArray以获得所需的功能。如果您使用的是swift,您可以简单地创建数组(外观)

那么,当您将两个数组设置为彼此相等时,编译器到底在做什么呢

Objective-C中的许多不可变类实现了
-copy
,因此方法只保留原始对象并返回指向它的指针。例如,如果复制
NSString
的实例,将返回指向同一对象的指针。因为这个对象是不可变的,所以不管你是否真的复制了它——这个对象是不能改变的,而且一个副本是完全相同的,所以指向原始对象的另一个指针的工作方式与副本的工作方式完全相同。再次保留该对象可确保至少在调用者处理完该对象之前不会销毁该对象

其他类也是如此,例如
NSArray
和可能的
NSData
NSDate
NSNumber
,以及其他类。一个全面的列表其实并不必要,因为行为应该对客户透明

如果您真的在使用
NSArray
的实例,很难理解您描述的问题是如何出现的。您不能从
NSArray
中添加或删除对象,这就是类不可变的含义。听起来您实际上在处理一个可变数组(
NSMutableArray
),当您调用
-copy
时,该类(以及其他类,如
NSMutableString
等)会进行实际复制

听起来您实际上并没有复制正在使用的数组,而是只复制指向数组的指针。例如:

NSArray *array1 = [NSMutableArray arrayWithObjects:@"foo", @"bar", nil];
NSArray *array2 = array1;
现在,上面的代码没有复制第一个数组。这里有一个数组,有两个变量指向它。如果对
array1
进行更改,您也会看到
array2
中反映的更改,因为
array1
array2
实际上只是同一数组的两个名称。如果需要副本,可以执行以下操作:

NSArray *array3 = [array1 copy];
现在,让我们做一个改变:

NSLog(@"Size of array1: %ld", [array1 count]);  // 2
NSLog(@"Size of array2: %ld", [array2 count]);  // 2
NSLog(@"Size of array3: %ld", [array3 count]);  // 2

[array1 removeObjectAtIndex:1];

NSLog(@"Size of array1: %ld", [array1 count]);  // 1
NSLog(@"Size of array2: %ld", [array2 count]);  // 1
NSLog(@"Size of array3: %ld", [array3 count]);  // 2