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