【问题标题】:Best practices for releasing retained views?发布保留视图的最佳实践?
【发布时间】:2011-10-26 20:07:12
【问题描述】:

这是在 iOS 4.x 或更低版本中释放 viewDidLoad 中保留的视图的正确(最佳?)方式吗?还有什么要考虑的吗?

- (void) viewDidUnload
{
    [super viewDidUnload];
    [self releaseViews];
}

- (void) dealloc {
    [self releaseViews];
    [super dealloc];
}

#define SAFE_RELEASE(a) [a release]; a = nil;

- (void) releaseViews {
    SAFE_RELEASE(myView1);
    SAFE_RELEASE(myView2);
    SAFE_RELEASE(myView3);
}

【问题讨论】:

    标签: iphone ios release dealloc viewdidunload


    【解决方案1】:

    -dealloc 是正确的,-viewDidUnload 将起作用,但通常保留的视图仅在 -viewDidUnload 中被取消而不被释放。这似乎也是 Apple 的做法,当您通过 Assistant 编辑器创建自动生成的 IBOutlet 时,这也是他们在 Xcode 中所采用的做法。

    对于自动生成的 IBOutlets,自动生成的 -viewDidUnload 如下所示:

    - (void)viewDidUnload {
        [self myView1:nil];
        [self myView2:nil];
        [self myView3:nil];
        [super viewDidUnload];
    }
    

    另外,来自Apple docs 上的-viewDidUnload

    放弃任何对象(包括插座中的对象)所有权的首选方法是使用相应的访问器方法将对象的值设置为 nil。但是,如果您没有给定对象的访问器方法,则可能必须显式释放该对象

    那么,就这样吧。如果您的插座有一个与之关联的属性(它们都应该不再),那么在-viewDidUnload 中将其归零——但不要释放它。当您考虑合成访问器中实际发生的事情时,这是有道理的。代码如下所示:

    - (void) setMyView1 : (UIView *) view {
       if (myView1) // the associated IVAR is already set
          [myView1 release];
    
       myView1 = [view retain];
    }
    

    如您所见,将 synthesize 属性设置为 nil 会隐式释放保留的对象。

    也来自有关-dealloc 的文档:

    如果你实现了这个方法,但正在为 iOS 2.x 构建你的应用程序,你的 dealloc 方法应该释放每个对象,但还应该在调用 super 之前将该对象的引用设置为 nil。

    除非你支持iOS2.x,否则不需要在dealloc中将对象设置为nil。

    所以,总结一下 Apple 关于 -viewDidUnload-dealloc 的文档:

    • -viewDidUnload 中,nil 属性(包括 IBOutlet 属性),但不要释放它们
    • -dealloc 发布属性中,但不要将它们归零(除非为 2.x 构建)。

    【讨论】:

    • 这些视图不是在设置为零之前发布的吗?我认为这些属性有“保留”。
    • 如果你有一个综合属性,将它们设置为 nil 确实隐式释放它们。
    【解决方案2】:

    我不确定这是否是最好的方法,但如果您在 viewDidLoad 中保留这些视图,这是正确的方法。

    请注意,在 dealloc 中不需要将变量设置为 nil,但这样做不会有任何坏处,因此我们可以对 viewDidLoad 和 dealloc 使用相同的方法。

    【讨论】:

      【解决方案3】:

      除非您在 viewDidLoad 中重新创建它们,否则不要在 viewDidUnload 中执行此操作,或者它们是 IBOutlets。好资料herehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 2020-08-15
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 2010-10-18
        相关资源
        最近更新 更多