yaofly2012 / note

Personal blog
https://github.com/yaofly2012/note/issues
44 stars 5 forks source link

NSArray, NSMutableArray #276

Open yaofly2012 opened 1 year ago

yaofly2012 commented 1 year ago

OC数组的类体系

image 通过NSArrayNSMutableArray接口,返回的却是子类对象:

  1. 创建一个NSArray对象时,实际上得到的是NSArray的子类__NSArrayI对象,只有一个对象的NSArray时,得到的是__NSSingleObjectArrayI类对象。
  2. 创建NSMutableArray对象,得到的同样是其子类__NSArrayM对象。

NSArray

不可变数组,内容不可改变。无法进行增加,删除操作。

基本语法

  1. 除了使用API创建NSArray,还可以用字面量@[]方式创建NSArray
  2. 元素类型可以是不同的 NSArray *arr4 = @[@1, @2, @"12"];

nil数组元素

  1. nil不可以作为数组的元素。
  2. 在方法initWithObjects里用nil只是作为列表结束标记。
    NSArray *arr = [NSArray arrayWithObjects:@1, @2, @3, nil, @4, nil];

    变量arr的值是[@1, @2, @3]nil后面的值都被忽略了。

nil数组

[nil count]是0。如果要判断数组是否是空数组可以直接这样:

if(arr.count) { // 不必 if(arr && arr.count)
 // 非空数组
}

NSMutableArray

可变数组,继承于NSArray,对NSArray进行了增删改的扩充。

nil

nil不能作为数组元素

NSMutableArray *mArr = [NSMutableArray arrayWithObjects:@1, @2, nil];
// 异常:uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
[mArr addObject:nil]; 

参考

  1. 【OC梳理】NSArray、NSMutableArray
  2. NSArray的基本使用 - OC
  3. OC防犯数组和字典崩溃策略整理
  4. How to add nil to nsmutablearray?
yaofly2012 commented 1 year ago

数组遍历

遍历的方式

  1. for
  2. for in
  3. Block回调方式:enumerateObjectsUsingBlock/enumerateObjectsWithOptions/enumerateObjectsAtIndexes
  4. 迭代器方式:objectEnumerator/reverseObjectEnumerator

选择合适的遍历方法

遍历的方式有多种,每种方式都存在即合理。至于选择哪种遍历方式完全取决个人需求。如果多个方式都满足需求可以基于性能选择。

参考

  1. Objective-C 数组遍历的性能及原理
  2. NSArray原理及遍历方法探究