【问题标题】:How does the release work in ARC based projects发布如何在基于 ARC 的项目中工作
【发布时间】:2012-09-17 16:42:48
【问题描述】:

我知道关于这个话题有很多问题。我从未从事过非 ARC 项目。

我有如下强弱属性

@property(strong,nonatomic)NSArray *data1;
@property(unsafe_unretained, nonatomic)NSArray *data2;

我在某些地方看到人们明确地将 viewDidUnload 中的数据设为 nil。

-(void)viewDidUnload{
    self.data1=nil;
    self.data2=nil;
}

我的问题是如果我不这样做(我的意思是如果我不使 data1 和 data2 为零

在viewDidUnload中),ARC会自动释放对象吗?

【问题讨论】:

    标签: objective-c xcode automatic-ref-counting


    【解决方案1】:

    是的,它们将在您的视图控制器被释放时被释放。 viewDidUnload(从 iOS 6 开始不再调用)与 dealloc 不同,也不是 viewDidLoad 的“对立面”——它仅在内存不足的情况下调用,即视图不在屏幕上时。

    didReceiveMemoryWarning 中的任何瞬态、占用内存的对象都应设置为 nil - ARC不会自动为您执行此操作。

    【讨论】:

    • 感谢您的快速回复
    【解决方案2】:

    是的,ARC 会在父对象销毁之前自动释放所有强引用属性/变量。至于“弱”引用,它们不会被保留/释放(不管有没有 ARC)。

    viewDidUnload 中设置self.data1 = nil 通常是不必要的,但有时您希望明确显示您的引用对象的释放位置。如果您想确保您的data1 在此代码行中发布,请使用您拥有的代码。如果您不在乎发布的时间和地点,则不必这样做。

    【讨论】:

    • 非常感谢您的快速帮助。
    • 顺便说一句,viewDidUnload 已被弃用。谁能解释一下 unsafe_unretained 和 weak 修饰符的区别?
    • 当指向的对象被释放时,弱引用变为 nil,不安全的引用不会(即像 ARC 之前一样悬空指针)。出于兼容性原因,您应该只使用 unsafe。
    • 我应该在哪里将 unsafe_unretained 设置为 nil ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多