一. removeObjectAtIndex和removeObject的不同之处
removeObjectAtIndex:
删除指定NSMutableArray中指定index的对象,注意index不能越界。
removeObject:
删除NSMutableArray中所有isEqual:待删对象的对象
从API文档可以看出,两者之间的主要区别是
removeObjectAtIndex:
最多只能删除一个对象,而removeObject:
可以删除多个对象(只要符合isEqual:的都删除掉)。
二. 在NSMutableArray循环中删除对象
1. 可能多删的做法
删除数组中的第一个@”remove”
1 | - (void)removeObjectsUseFor |
结果如下:
1 | 2016-09-20 21:14:13.541 RemoveObject[5862:310398] ( |
从
removeObject:
的说明中可以看出,removeObject:
不仅删除该对象本身,而且删除NSMutableArray中所有isEqual:
待删对象的对象
2. 可能漏删的做法
删除数组中所有的@”remove”
1 | - (void)removeObjectsUseFor |
输出:
1 | 2016-09-20 21:19:59.615 RemoveObject[5886:315162] ( |
3. 引发崩溃的做法
删除数组中所有的@”remove”
1 | - (void)removeObjectsUseForIn |
输出:崩溃
1 | 1. svn (del, remove, rm) 没搞明白2016-09-20 21:27:40.337 RemoveObject[5915:321407] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x7f9388c95580> was mutated while being enumerated.' |
不要在for in 循环中删除数组内部对象。
4. 正确但别扭的做法
删除数组中所有的@”remove”
1 | - (void)removeObjectsReversed |
输出:
1 | 2016-09-20 21:31:37.655 RemoveObject[5934:325316] ( |
倒序删除,正确但有点别扭!
5. 优雅的做法
1 | - (void)removeObjectsUseEnumration |
输出:
1 | 2016-09-20 22:10:42.404 RemoveObject[6014:338210] <NSIndexSet: 0x7fb73a516040>[number of indexes: 2 (in 2 ranges), indexes: (1 3)] |
先通过
indexesOfObjectsPassingTest:
把待删除对象的index找出来,再调用removeObjectsAtIndexes:
进行一次性删除。
三. 总结
- 不建议在NSMutableArray循环中使用removeObject:删除该NSMutableArray内部对象,此举可能引发误删,如2.1所示;
- 不建议在NSMutableArray的for in 循环中删除对象,此举可能引发崩溃,如2.3所示;
- 建议删除NSMutableArray内部对象时,先拿到待删对象的index,再进行一次性删除,如2.5所示。