NSMutableArray
推荐阅读
iOS 实录 12:NSMutableArray 使用中忽视的问题
NSMutableArray 是可变数组,数组中存储空间是可以动态修改,可以添加、删除或对指针重新进行排序。
NSMutableArray 继承于 NSArray, NSArray 的方法都可以使用,。
数组的创建
Person *p1 = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Person *p3 = [[Person alloc] init];
//1.初始化时添加元素
NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:p1,p2,p3, nil];
//2.创建空数组,再往里面添加
NSMutableArray *mArray2 = [[NSMutableArray alloc] init];
// 类方法
NSMutableArray *mArray21 = [NSMutableArray array];
//3.创建数组时,同时为数组分配3个存储空间,当3个空间全满之后,会自动扩展空间。
NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithCapacity:3];
addObject: 添加元素
[mArray1 addObject:p1];
count: 取得数组元素个数
NSLog(@"%ld",[mArray1 count]);
将数组 mArray2 中所有元素全部追加到 mArray1 中
[mArray1 addObjectsFromArray:mArray2];
指定位置插入元素
[mArray1 insertObject:@"hello" atIndex:0];
替换元素
[mArray1 replaceObjectAtIndex:0 withObject:@"替换的元素"];
索引 0 和索引 3 上的元素调换,可用于排序。
[mArray1 exchangeObjectAtIndex:0 withObjectAtIndex:3];
实例:
获取到的 NSMutableArray 类型的数据需要逆序显示到 UITableView 上,之前用的方法是在索引上动手脚: NSUInteger index = self.dateSourceArray.count - indexPath.row - 1;
, 缺点是在 tableView:cellForRowAtIndexPath:
和 tableView:didSelectRowAtIndexPath:
都要先获取反向索引值再获取数据。参考 YYKit 的源码中的方法,直接在数据源上做处理:[self.dateSourceArray reverse];
// 反转数组,摘自 YYCategories
- (void)reverse {
NSUInteger count = self.count;
int mid = floor(count / 2.0);
for (NSUInteger i = 0; i < mid; i++) {
[self exchangeObjectAtIndex:i withObjectAtIndex:(count - (i + 1))];
}
}
删除元素
//1>根据下标删除元素
[mArray1 removeObjectAtIndex:0];
//2>删除指定的对象
[mArray1 removeObject:@“hello”];
//3>删除最后一个元素
[mArray1 removeLastObject];
//4>删除所有元素
[mArray1 removeAllObjects];
Tips:YYKit 框架中针对数组添加了几个很实用的扩展方法,列几个随意感受下:
// 以下摘自 NSArray+YYAdd.h
// 返回数组中的随机一个元素
- (nullable id)randomObject;
// 返回指定位置的元素,如果为空或者数组越界就会返回 nil
- (nullable id)objectOrNilAtIndex:(NSUInteger)index;
// 删除第一个对象
- (void)removeFirstObject;
// 删除最后一个对象
- (void)removeLastObject;
// 返回并删除第一个对象
- (nullable id)popFirstObject;
// 返回并删除最后一个对象
- (nullable id)popLastObject;
排序
使用给定的排序描述符数组对接收方进行排序:
- (void)sortUsingDescriptors:(NSArray<NSSortDescriptor *> *)sortDescriptors;
例:
排序前:BMITime [5045:651300] employees: (
“<Employee 0: $0 in assets>”,
“<Employee 1: $503 in assets>”,
“<Employee 2: $469 in assets>”,
“<Employee 3: $768 in assets>”,
“<Employee 4: $0 in assets>”,
“<Employee 5: $836 in assets>”,
“<Employee 6: $819 in assets>”,
“<Employee 7: $384 in assets>”,
“<Employee 8: $0 in assets>”,
“<Employee 9: $486 in assets>”
)
// 先根据 valueOfAssets 属性进行 升序 排序
NSSortDescriptor *voa = [NSSortDescriptor sortDescriptorWithKey:@"valueOfAssets" ascending:YES];
// 如果某两个对象的 valueOfAssets 属性相同,再根据 employeeID 属性 升序 排序
NSSortDescriptor *eid = [NSSortDescriptor sortDescriptorWithKey:@"employeeID" ascending:YES];
[employees sortUsingDescriptors:@[voa,eid]];
结果:
BMITime[5010:648085] employees: (
“<Employee 0: $0 in assets>”,
“<Employee 4: $0 in assets>”,
“<Employee 8: $0 in assets>”,
“<Employee 7: $384 in assets>”,
“<Employee 2: $469 in assets>”,
“<Employee 9: $486 in assets>”,
“<Employee 1: $503 in assets>”,
“<Employee 3: $768 in assets>”,
“<Employee 6: $819 in assets>”,
“<Employee 5: $836 in assets>”
)