【问题标题】:removeAllObjects and nil-ing NSMutableDictionaryremoveAllObjects 和 nil-ing NSMutableDictionary
【发布时间】:2016-03-04 13:27:03
【问题描述】:

这可能会导致投票失败....但必须问一下。 当“释放”一个可变字典时,你调用removeAllObjects,但你可以将它设置为nil吗?那会有同样的结果吗? 就像当你释放一个数组时,你将它设置为 nil。我可以对可变数组执行此操作而不是调用removeAllObjects吗?

【问题讨论】:

    标签: objective-c nsmutabledictionary dealloc


    【解决方案1】:

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

    【讨论】:

    • 啊,我现在明白了。那么将它设置为 nil 会释放它还是不释放它?
    • Yes nil 表示它正在释放。
    • 它没有。在 ARC 下,它会删除对对象的引用。在删除所有对它的引用之前,该对象不会释放。
    • 删除引用不是从字典中删除所有对象。如果我们从字典中删除所有对象但有一个全局变量使其保持活动状态,则字典不会被释放。
    • 我的意思是删除引用与释放对象不同。
    【解决方案2】:

    首先,忽略绝对的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 有时可能会返回一个自动释放的对象,有时它不会取决于编译器优化级别或版本。

    【讨论】:

    • 那个 'whentouseretaincount dot com' 链接是某种病毒或木马,控制浏览器,禁止关闭,并试图在我的 Mac 上安装软件。
    • @LogicsaurusRex 谢谢。
    【解决方案3】:

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

    希望有帮助

    【讨论】:

    • 等待,但根据 user345095,即使您删除了数组的所有对象,除非您将其设置为 nil,否则它不会被释放。我错过了什么
    • 我已经详细说明了我的答案,以展示 retainCount 是如何工作的 :) 数组中的对象数量与何时解除分配无关
    • 绝对保留计数没有用。不要考虑它。您应该只担心您是增加还是减少保留计数(或者,在 ARC 中,您是否持有强引用)。例子; 技术上在第一行代码(在 ARC 中)之后,arr 的保留计数可能是 2。或许?是的;取决于编译器版本和优化级别。 whentouseretaincount.com
    • 我更新了答案,没有特别提到retainCount。我仍然认为讨论对对象的引用数量以便能够概念化正在发生的事情是有用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多