【发布时间】:2016-03-04 13:27:03
【问题描述】:
这可能会导致投票失败....但必须问一下。
当“释放”一个可变字典时,你调用removeAllObjects,但你可以将它设置为nil吗?那会有同样的结果吗?
就像当你释放一个数组时,你将它设置为 nil。我可以对可变数组执行此操作而不是调用removeAllObjects吗?
【问题讨论】:
标签: objective-c nsmutabledictionary dealloc
这可能会导致投票失败....但必须问一下。
当“释放”一个可变字典时,你调用removeAllObjects,但你可以将它设置为nil吗?那会有同样的结果吗?
就像当你释放一个数组时,你将它设置为 nil。我可以对可变数组执行此操作而不是调用removeAllObjects吗?
【问题讨论】:
标签: objective-c nsmutabledictionary dealloc
RemoveAllObjects 不会释放字典。它只是从该字典中删除所有键值。您可以设置新的键值,而无需再次初始化。但是将其设置为 nil 意味着您需要在插入新值之前再次对其进行初始化。
【讨论】:
首先,忽略绝对的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] 有时会返回一个 autoreleased 对象。因此,坐在调试器中,并在将 dict 设置为 nil (可能通过 __weak 引用)后检查字典是否立即释放会导致抱歉。请注意,+dictionary 有时可能会返回一个自动释放的对象,有时它不会取决于编译器优化级别或版本。
【讨论】:
简短的回答是肯定的。如果删除对字典的引用(无论它是否可变),并且字典对象的引用计数达到 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
希望有帮助
【讨论】:
arr 的保留计数可能是 2。或许?是的;取决于编译器版本和优化级别。 whentouseretaincount.com