如何清除字典?

4th*_*ace 19 iphone cocoa-touch objective-c nsmutabledictionary

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

[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];
Run Code Online (Sandbox Code Playgroud)

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

And*_*ite 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

  • 这不回答这个问题.字典上的`-release`将释放所有包含的对象.4thSpace有一个不同的问题. (5认同)

bbu*_*bum 30

你说:

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

如果-release可变字典导致字典被解除分配 - 将保留计数丢弃为零 - 那么可变字典将释放所有包含的对象.总是.

因此,如果没有释放对象,那么建议"修复"......

[myDictionary removeAllObjects];
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];
Run Code Online (Sandbox Code Playgroud)

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

因此,调用-removeAllObjects 清空字典并释放所有包含的对象,但您仍然有一个内存泄漏,您应该弄清楚并修复.


直言不讳:

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

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

  2. -retain字典上仍然有一个优秀 的.

既然你说在调用时对象是正确的(如在预期中那样)-removeAllObjects,那么它必须是(2).查看您的代码并找出哪里有额外-retain的字典.您可以使用Object Alloc仪器确切地确定所有保留的来源.


Ben*_*ieb 6

正如Andy所说,-removeAllObjects将起作用.但是,如果您的任何字典对象是自动释放的,或者字典本身已经在该行的某个位置自动释放,那么在下次runloop完成时(自动释放池耗尽时)它们将不会被释放. .