19

我目前正在执行以下操作以清除 NSMutableDictionary

[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];

释放行实际上并不释放字典中的任何对象。我仍然可以在下一行看到所有这些。直到执行 alloc 行,字典才被清零。有更好的方法吗?

4

4 回答 4

34

我暂时无法测试,但是您尝试过的removeAllObjects方法NSMutableDictionary吗?

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html#//apple_ref/occ/instm/NSMutableDictionary/removeAllObjects

于 2009-12-31T21:31:33.400 回答
30

你说:

释放行实际上并不释放字典中的任何对象。我仍然可以在下一行看到所有这些。直到执行 alloc 行,字典才被清零。有更好的方法吗?

如果-release可变字典导致字典被释放——将保留计数降至零——那么可变字典将释放所有包含的对象。总是。

因此,如果对象没有被释放,那么这建议“修复”......

[myDictionary removeAllObjects];
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];

... 是内存泄漏,因为 NSMutableDictionary 的原始实例将被泄漏。

结果,调用-removeAllObjects 清空字典并释放所有包含的对象,但是您仍然应该找出并修复内存泄漏。


说白了:

如果在字典接收到上述内容时-release(没有调用-removeAllObjects),字典中的对象没有被释放,则存在内存泄漏。它是:

  1. 字典中的对象被保留了额外的时间。

  2. -retain字典上还有一个优秀 的。

既然你说当你调用时对象被正确地(如预期的那样)释放-removeAllObjects,那么它必须是(2)。查看您的代码并找出-retain字典的额外内容。您可以使用Object Alloc工具来确定所有保留的确切来源。

于 2009-12-31T21:42:20.027 回答
6

正如安迪所说,-removeAllObjects 将起作用。但是,如果您的字典的任何对象是自动释放的,或者字典本身已经在沿线某处自动释放,那么它们将不会被释放,直到下次运行循环完成(当自动释放池耗尽时) .

于 2009-12-31T21:37:47.553 回答
3
[aMutableDictionary removeAllObjects];

来自Apple 的文档

(void)removeAllObjects

说明 - 清空其条目的字典。每个键和对应的值对象都被发送一个释放消息。

可用性 - iOS(2.0 及更高版本)

于 2014-01-27T17:36:58.930 回答