重用时 NSMutableArray removeAllObjects 与 new
NSMutableArray removeAllObjects vs new when reusing
在 ARC 下,removeAllObjects
在 NSMutableArray
上对于 CPU(明确地单独释放对象)是否会比简单地执行 myArray = [NSMutableArray new];
并让 ARC在下一轮释放时捕获整个释放的内存块?
我可以用 2 段代码对此进行测试,但由于优化等原因,我真的只是对机制感到好奇。从 C
的角度来看,感觉调用所有对象都被释放听起来更强烈,但也许 dealloc
中的树 Objective-C 可能足以让 ARC 以相同的速度执行此操作?
某些代码必须在 NSMutableArray
内循环遍历该数组,并对其所有非 nil
对象调用 release
。如果在 ARC 内部或 NSMutableArray
内部执行的代码之间存在差异,则不应引起注意,因为昂贵的部分不是循环开销,而是 release
的实际调用和潜在的释放关注它。
不过,还有一个更显着的区别:当您调用 removeAllObjects
时,数组会保留其内部存储空间,因此下次您开始向其追加时它不必增加其内部大小。如果您的使用模式要求将大量项目重复添加到同一个数组,调用 removeAllObjects
可能会为您节省一些 allocation/reallocation 个周期。
在 ARC 下,removeAllObjects
在 NSMutableArray
上对于 CPU(明确地单独释放对象)是否会比简单地执行 myArray = [NSMutableArray new];
并让 ARC在下一轮释放时捕获整个释放的内存块?
我可以用 2 段代码对此进行测试,但由于优化等原因,我真的只是对机制感到好奇。从 C
的角度来看,感觉调用所有对象都被释放听起来更强烈,但也许 dealloc
中的树 Objective-C 可能足以让 ARC 以相同的速度执行此操作?
某些代码必须在 NSMutableArray
内循环遍历该数组,并对其所有非 nil
对象调用 release
。如果在 ARC 内部或 NSMutableArray
内部执行的代码之间存在差异,则不应引起注意,因为昂贵的部分不是循环开销,而是 release
的实际调用和潜在的释放关注它。
不过,还有一个更显着的区别:当您调用 removeAllObjects
时,数组会保留其内部存储空间,因此下次您开始向其追加时它不必增加其内部大小。如果您的使用模式要求将大量项目重复添加到同一个数组,调用 removeAllObjects
可能会为您节省一些 allocation/reallocation 个周期。