【问题标题】:Why would you set-to-nil AND release a property of a UIViewController?为什么要设置为 nil 并释放 UIViewController 的属性?
【发布时间】:2023-03-12 08:28:02
【问题描述】:

Apple 文档中有一些我没有得到的东西。这是 UIViewController 类的 -(void)viewDidUnload 的摘录:

你的 dealloc 方法应该释放 每个对象,但还应该设置 之前对该对象的引用为零 调用超级。

如果您在代码中对 xxx 属性使用保留和合成,为什么大多数 Apple 示例在 viewDidUnload 中设置为零:

self.xxx = nil;

但建议在 dealloc 中同时设置为零和释放:

[xxx release];
self.xxx = nil;

为什么对于 dealloc 设置为零还不够?

ps:我知道我的问题与"Why release a property that you've already set to nil?" 非常相似,但并不完全相同

【问题讨论】:

    标签: ios memory-management properties uiviewcontroller dealloc


    【解决方案1】:
    [xxx release];
    self.xxx = nil;
    

    这是错误的,因为 xxx 会被释放两次,推荐的方式是释放 iVar 并将其设置为 nil,而不是使用属性:

    [xxx release];
    xxx = nil;
    

    不只是使用的原因

    self.xxx = nil;
    

    是调用setter方法可能有一些副作用,可能会导致dealloc方法出现问题(即使用其他可能已经被释放的iVar)

    【讨论】:

    • 感谢您的回答。这是否意味着如果一个100%确定setter方法没有副作用(例如当合成的没有被覆盖时),我们可以使用self.xxx = nil作为释放内存的唯一调用?
    • 我们可以,但是 setter 实现在未来发生变化并引入副作用的可能性仍然很小......但在大多数情况下 self.xxx = nil 应该可以正常工作
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多