NSArray和NSMutableArray是Objective-C中用于存储一组对象的两个常用类。NSArray是不可变的数组类,一旦创建后,其内容无法被修改。NSMutableArray是可变的数组类,允许动态地添加、删除和修改数组内容。
本篇博客笔者讲解了NSArray和NSMutableArray方法的使用总结以及对深浅拷贝的总结.
下面是一个示例代码,演示了它们的一些常见方法和功能:
1. 常见使用方法讲解
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建一个不可变数组
NSArray *immutableArray = @[@"Apple", @"Banana", @"Cherry"];
NSLog(@"Immutable Array: %@", immutableArray);
// 获取数组元素数量
NSUInteger count = [immutableArray count];
NSLog(@"Number of elements in Immutable Array: %lu", (unsigned long)count);
// 获取数组中的元素
NSString *firstElement = [immutableArray objectAtIndex:0];
NSLog(@"First element: %@", firstElement);
// 检查数组是否包含某个对象
if ([immutableArray containsObject:@"Banana"]) {
NSLog(@"Immutable Array contains 'Banana'");
}
// 创建一个可变数组
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:immutableArray];
NSLog(@"Mutable Array: %@", mutableArray);
// 添加元素到可变数组
[mutableArray addObject:@"Date"];
NSLog(@"Updated Mutable Array: %@", mutableArray);
// 插入元素到可变数组
[mutableArray insertObject:@"Grapes" atIndex:2];
NSLog(@"Inserted Mutable Array: %@", mutableArray);
// 替换元素
[mutableArray replaceObjectAtIndex:0 withObject:@"Apricot"];
NSLog(@"Replaced Mutable Array: %@", mutableArray);
// 移除元素
[mutableArray removeObject:@"Cherry"];
NSLog(@"Removed Mutable Array: %@", mutableArray);
// 移除所有元素
[mutableArray removeAllObjects];
NSLog(@"Emptied Mutable Array: %@", mutableArray);
}
return 0;
}
这段代码演示了如何创建、操作和处理NSArray和NSMutableArray的对象。不可变数组一旦创建后无法更改,而可变数组可以进行各种修改操作。这些数组类提供了丰富的方法,以满足不同的数组操作需求。现在让我解释代码中使用的关键方法和功能:
-
不可变数组 (
NSArray
):- 创建不可变数组:使用
@[@"object1", @"object2"]
或[NSArray arrayWithObjects:@"object1", @"object2", nil]
。 - 获取数组元素数量:使用
[array count]
。 - 获取数组中的元素:使用
[array objectAtIndex:index]
。 - 检查数组是否包含对象:使用
[array containsObject:@"object"]
。
- 创建不可变数组:使用
-
可变数组 (
NSMutableArray
):- 创建可变数组:使用
[NSMutableArray arrayWithArray:immutableArray]
。 - 添加元素:使用
[mutableArray addObject:@"newObject"]
。 - 插入元素:使用
[mutableArray insertObject:@"newObject" atIndex:index]
。 - 替换元素:使用
[mutableArray replaceObjectAtIndex:index withObject:@"newObject"]
。 - 移除元素:使用
[mutableArray removeObject:@"object"]
。 - 移除所有元素:使用
[mutableArray removeAllObjects]
。
- 创建可变数组:使用
当处理NSArray和NSMutableArray时,还有一些其他常见方法和知识点可以考虑:
-
遍历数组:
- 使用快速枚举(Fast Enumeration)来遍历数组,这是一种简便的方式,例如:
for (NSString *item in mutableArray) { NSLog(@"Item: %@", item); }
- 使用快速枚举(Fast Enumeration)来遍历数组,这是一种简便的方式,例如:
-
排序数组:
- 对数组进行排序,可以使用
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator
方法或使用- (void)sortUsingSelector:(SEL)comparator
方法,前者返回一个新的排好序的数组,后者在原数组上进行排序。
- 对数组进行排序,可以使用
-
数组的深拷贝和浅拷贝:
- 使用
- (id)copy
和- (id)mutableCopy
方法来进行深拷贝和浅拷贝。深拷贝会创建一个新的数组,包含相同元素的副本,而浅拷贝只会创建一个新的引用,指向原始数组。
- 使用
-
不同数据类型的元素:
- NSArray和NSMutableArray可以包含不同类型的对象,但最好保持数组中的元素类型一致,以便更容易处理。
-
使用NSArray的初始化方法:
- 除了
NSArray
和NSMutableArray
类方法创建数组之外,还可以使用- (instancetype)initWithObjects:(id) firstObject, ...
和- (instancetype)initWithArray:(NSArray *)array
等初始化方法来创建数组。
- 除了
-
NSArray和NSMutableArray的性能:
- 在大型数据集上进行频繁的插入和删除操作时,
NSMutableArray
通常会更高效,因为它们允许修改。不可变数组NSArray
通常在读取时更高效,因为它们不需要支持修改操作。
- 在大型数据集上进行频繁的插入和删除操作时,
-
数组中的nil值:
- NSArray和NSMutableArray可以包含nil值,但在处理时需要小心处理nil值的情况,以避免潜在的崩溃。
2. 深浅拷贝总结:
1. NSArray和NSMutableArray中,copy方法对于不可变数组和可变数组都执行浅拷贝,
而mutableCopy方法对于不可变数组和可变数组都执行深拷贝。因此,在需要创建独立的数组副本时,通常使用mutableCopy方法。
2. copy返回的都是可变不可变数组 - 那么对NSMutableArray执行copy时,返回的仍然是浅拷贝的不可变数组,但是改变原数组,新的数组仍然会跟着改变,即使它本身是不可变的mutableCopy方法返回的都是可变数组