【问题标题】:Assigning nil to a variable of an initialized object is releasing it?将 nil 分配给已初始化对象的变量是否正在释放它?
【发布时间】:2012-04-30 17:02:55
【问题描述】:

我有类似的问题:What is the difference between setting object = nil and [object release] VS [object release] and object = nil?

NSMutableArray *myExampleArray = [[NSMutableArray alloc] init];
myExampleArray = nil;

我使用iOS 5.0 自动引用计数,所以实际上我没有释放任何对象。因此,如果我将其分配给 nil 是否等于 [myExampleArray release] ?

我知道如果不重新初始化 myExampleArray,我以后就无法使用它。那么下一个问题。 清除这个 NSArray 的最佳方法是什么?

【问题讨论】:

    标签: objective-c ios memory-management ios5


    【解决方案1】:

    是的,在 ARC 环境中,您永远不会调用 release。所以给变量赋值 nil 会释放对象。

    在非 ARC 环境中,您会自行发布,因此对象会被销毁。但该变量仍将指向旧对象地址。但是没有对象了,所以如果你稍后使用这个变量,你可能会崩溃(EXC_BAD_ACCESS)。如果您也将 nil 分配给它,那将不会发生。因为变量不会再指向旧的对象地址了。

    您的另一个问题: 如果您稍后再次需要该数组,您可以在 NSMutableArray 上调用 removeAllobjects 以删除所有添加的对象,就像 Ankit Gupta 已经说过的那样。这将导致一个空数组,它仍然存在,因此您可以重复使用它。

    【讨论】:

    • 谢谢!这有助于填补空白。
    【解决方案2】:

    不要为你的对象使用 Nil
    试试这条线:

    [myExampleArray removeAllobjects];
    

    【讨论】:

    • 谢谢,但我也想知道分配给 nil 的作用是什么?和释放内存一样吗?
    • @Kuba 分配给nil 类似于释放内存,但不一样。它将首先减少引用计数,如果该计数器现在为 0,它将很快(不一定立即)释放内存。清空数组是不同的:只有数组的元素会受到引用计数减少的影响。
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多