removeAllObjects 和 nil-ing NSMutableDictionary

removeAllObjects and nil-ing NSMutableDictionary

这可能会降低选票....但必须问问。 当 "deallocating" 一个可变字典时,你调用 removeAllObjects 但你可以将它设置为 nil 吗?那会有相同的结果吗? 就像当你 dealloc 一个数组时,你将它设置为 nil。我可以对可变数组执行此操作而不是调用 removeAllObjects 吗?

RemoveAllObjects 不会释放字典。它只是从该字典中删除所有键值。您可以设置新的键值对而无需再次初始化。但是将它设置为 nil 意味着你需要在插入新值之前再次初始化它。

简短的回答是肯定的。如果删除对字典的引用(无论它是否可变),并且字典对象的引用计数达到 0,则字典将被释放,从而释放对它先前持有的对象的所有引用。如果引用计数达到零,数组的对象同样会被释放。

所有这一切都通过 ARC 自动发生,因此您只需要担心在代码中不保留对数组对象的任何引用以确保它们被释放。

NSMutableArray *arr = [NSMutableArray array]; //1 reference to the array
NSMutableArray *anotherReference = arr; //2 references to the array
arr = nil; //there is still 1 reference to the array, so it is not dealloced
anotherReference = nil; //no references left and the array is dealloced

希望对您有所帮助

首先,忽略绝对值retainCount。这是没用的。请参阅(此处已遗憾消失的网站是新网站)http://sdarlington.github.io

其次,字典的内容不会影响字典本身的生命周期(除非字典中的对象之一对字典有强引用,创建一个保留周期)。

因此 removeAllObjects 与字典的生命周期完全正交(保留循环警告适用)。

同样,当对字典的所有强引用 (ARC) 都被销毁时,字典将被释放,并且在该过程中,字典对其包含的对象的所有硬引用也将被释放。

即:

NSDictionary *dict = [NSDictionary dictionaryWithObjectAndKey:@(1),@"one"];

NSDictionary *doct = dict;

dict = nil;   // nothing happens

[something consumeDict:doct];

dict = nil;

最后 dict = nil;,字典 可能 被破坏。或不。它可能不会立即被销毁,因为 consumeDict: 在某处引起了强引用,或者因为 consumeDict: 调用了 retain 然后 autorelease 并且字典将一直存在直到池被耗尽。

说到池,有时 [NSDictionary dictionary] return 是一个 自动释放的 对象。因此,坐在调试器中检查字典是否在将 dict 设置为 nil 后立即发布(可能通过 __weak 引用)将导致遗憾。并注意 +dictionary 有时可能 return 一个自动释放的对象,有时它不会取决于编译器优化级别或版本。