0%

《Objective-C 编程》17.NSMutableArray

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>”
)

欢迎关注我的其它发布渠道