Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NSArray, NSMutableArray #276

Open
yaofly2012 opened this issue May 24, 2023 · 1 comment
Open

NSArray, NSMutableArray #276

yaofly2012 opened this issue May 24, 2023 · 1 comment
Labels

Comments

@yaofly2012
Copy link
Owner

yaofly2012 commented May 24, 2023

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
Copy link
Owner Author

yaofly2012 commented May 24, 2023

数组遍历

遍历的方式

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

选择合适的遍历方法

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

参考

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

@yaofly2012 yaofly2012 added OC and removed TODO labels May 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant