iOS for...in 循环
0x00 循环遍历一
输出结果是什么?
NSMutableArray *marr = @[@1, @2, @3].mutableCopy;
for (NSNumber *number in marr) {
NSLog(@"%@", number);
marr = @[@4, @5, @6].mutableCopy;
}
NSLog(@"%@", marr);
0x01 循环遍历二
输出结果是什么?
NSMutableArray *marr = @[@1, @2, @3].mutableCopy;
for (NSNumber *number in marr) {
NSLog(@"%@", number);
[marr addObject:@4];
}
NSLog(@"%@", marr);
0x02 循环遍历三
输出结果是什么?
var arr = [1, 2, 3]
for number in arr {
print(number)
arr = [4, 5, 6]
}
print(arr)
0x03 循环遍历四
输出结果是什么?
var arr = [1, 2, 3]
for number in arr {
print(number)
arr.append(4)
}
print(arr)
0x04 答案
循环遍历一,输出:
1
2
3
(
4,
5,
6
)
循环遍历二:
打印 1
后,崩溃:
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x60000075c3c0> was mutated while being enumerated.'
循环遍历三,输出:
1
2
3
[4, 5, 6]
循环遍历四,输出:
1
2
3
[1, 2, 3, 4, 4, 4]
0x05 结论
for…in 循环过程中,OC
不能修改集合,Swift
可以修改
直接改变指向,都没问题!
特性 | Objective-C | Swift |
---|---|---|
集合类型 | 类对象(NSArray、NSMutableArray) | 值类型(Array、Dictionary) |
内存管理 | 引用计数(ARC) | 值类型(栈内存),引用类型(ARC) |
枚举行为 | 快速枚举,修改集合会导致崩溃 | 基于迭代器协议,值类型修改不影响枚举 |
修改集合的影响 | 直接修改集合会导致崩溃 | 值类型修改不影响枚举,引用类型可能崩溃 |