NSArray或NSMutableArray的removeAllObjects方法会释放内存吗?

3
我需要知道NSArray或NSMutableArray的removeAllObjects方法是否会释放内存。
如果我的数组有10000个元素。 我能使用这个方法来释放内存吗?
[array removeAllObjects];

释放内存并重新加载其他元素?还是会导致内存泄漏?
谢谢
举个例子,如果我的NSMutable数组大小为20mb,有10,000个元素... 如果我使用removeAllObjects方法...它的大小是否为0mb?
3个回答

4

是的,它释放了所有对象,不会泄漏。(当然,它并没有显式地释放它们 - 它们只有在数组持有它们的唯一引用时才被释放。)


1
当我看到这个问题的标题时,我必须检查是否有其他人已经给出了这个答案。 - David Rönnqvist
如果我的NSMutable数组大小为20MB,例如有10,000个元素... 如果我使用removeAllObjects方法...它的大小会变成0MB吗? - Usi Usi
@UsiUsi 这取决于。您正在混淆释放对象和释放对象的内存。在发送此消息后,数组将为空,但是没有人可以保证此操作实际上会释放一些(如果有)内存,因为可能不仅是数组持有对对象的引用。 - user529758
为了确保所有元素都释放内存,我必须这样做 [array release]; - Usi Usi
@UsiUsi 不行。为了确保所有元素都被释放,您必须正确管理内存,它们将在不再需要时立即被释放。 - user529758

3
一个 NS[Mutable]Array 是一个对象引用的集合。调用 -removeAllObjects 会将这些引用设为 nil。数组本身的容量和内存使用不发生变化。对于 NSMutableArray,这些引用可以被重用来指向其他对象。NSArray 没有 -removeAllObjects 方法,因为它不可变。 removeAllObjects 对于大量对象会比 initWithCapacity 稍微慢一些。真正的性能差别在于当对象数量达到限制时需要避免扩展数组。
正如其他人指出的那样,只有当没有更多强引用时对象才会被释放。

谢谢...但是如果我的NSMutable数组大小为20MB,有10,000个元素,例如...如果我使用removeAllObjects方法...它的大小将变为0MB吗? - Usi Usi
是的(如果所持有的对象没有被其他地方引用)。数组并未使用20MB的存储空间,而是所持有的对象。如果您正在使用Xcode 5,可以通过设置断点、单击内存计量器,然后在Instruments上单击Profile来查看这些内容。释放的内存将在内存图表上显著可见。 - Jano

0

不,它不会泄漏对象。它与逐个删除每个对象相同,只是更方便和更快速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接