removeAllObjects和nil-ing NSMutableDictionary

时间:2016-03-04 13:27:03

标签: objective-c nsmutabledictionary dealloc

这可能会降低选票......但是要问。 当“解除分配”一个可变字典时,你打电话给removeAllObjects,但你可以把它设置为nil吗?会有同样的结果吗? 就像你释放一个数组一样,你将它设置为nil。我可以这样做到一个可变数组而不是调用removeAllObjects吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

其次,字典的内容不会影响字典本身的生命周期(除非字典中的某个对象具有对字典的强引用,从而创建保留周期)。 / p>

因此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]会返回自动释放的对象。因此,坐在调试器中,并检查字典是否在将dict设置为nil后立即释放(可能通过__weak引用)将导致抱歉。请注意,+字典有时可能会返回一个自动释放的对象,或者有时它不会依赖于编译器优化级别或版本。

答案 2 :(得分:0)

简短的回答是肯定的。如果删除对字典的引用(无论它是否可变),并且字典对象的引用计数达到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

希望有所帮助