在Objective-C中,NSArray是一种用于存储多个对象的有序集合的类。它是不可变的,即一旦创建就不能修改其内容。NSArray提供了一些方法来访问和操作其中的对象,例如添加、删除、替换等操作。然而,一个常见的问题是:NSArray是否复制对象?
NSArray的基本特性NSArray是使用引用来存储对象的,而不是复制对象本身。这意味着当你将一个对象添加到NSArray中时,NSArray只是保存了对该对象的引用,而不是复制该对象的内容。因此,如果你修改了原始对象,NSArray中保存的引用也会反映出这些修改。案例代码为了更好地理解NSArray的特性,让我们来看一个简单的示例代码:// 创建一个可变数组NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"Apple", @"Banana", @"Orange", nil];// 创建一个不可变的NSArray,复制mutableArrayNSArray *array = [NSArray arrayWithArray:mutableArray];// 修改原始对象[mutableArray removeObjectAtIndex:0];// 打印不可变数组NSLog(@"%@", array);上述代码创建了一个可变数组mutableArray,并使用它创建了一个不可变的NSArray对象array。然后,我们从mutableArray中删除了第一个对象。最后,我们打印出不可变数组array的内容。预期的输出是:
( Banana, Orange)从输出结果可以看出,当我们修改了mutableArray时,不可变数组array并没有受到影响。这是因为NSArray只是保存了对原始对象的引用,而不是复制对象本身。NSArray中的对象复制虽然NSArray本身不会复制对象,但你仍然可以通过手动复制对象来创建一个新的NSArray。这可以通过使用NSArray的`initWithArray:copyItems:`方法来实现。该方法接受一个原始的NSArray和一个布尔值参数,用于指定是否复制数组中的对象。让我们看一个示例代码:
// 创建一个可变数组NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"Apple", @"Banana", @"Orange", nil];// 复制数组中的对象NSArray *copiedArray = [[NSArray alloc] initWithArray:mutableArray copyItems:YES];// 修改原始对象[mutableArray removeObjectAtIndex:0];// 打印复制的数组NSLog(@"%@", copiedArray);预期的输出是:
( Apple, Banana, Orange)从输出结果可以看出,通过手动复制对象,我们创建了一个新的NSArray,并且当我们修改原始数组时,复制的数组并没有受到影响。在Objective-C中,NSArray是使用引用来存储对象的,而不是复制对象本身。当你将一个对象添加到NSArray中时,NSArray只是保存了对该对象的引用,而不是复制该对象的内容。因此,如果你修改了原始对象,NSArray中保存的引用也会反映出这些修改。但是,你仍然可以通过手动复制对象来创建一个新的NSArray,这样修改原始对象时不会影响到复制的数组。