【问题标题】:Objective C iPhone when to set object references to nilObjective C iPhone何时将对象引用设置为nil
【发布时间】:2010-12-12 20:31:15
【问题描述】:

我已经使用 Objective C 和 Cocoa 框架进行开发已经有一段时间了。但是,我仍然不完全清楚,什么时候应该将对象引用设置为 nil。我知道建议在释放具有委托的对象之前立即执行此操作,并且您还应该在 viewDidUnload 方法中为保留的子视图执行此操作。但究竟什么时候应该这样做,为什么?它究竟完成了什么?提前谢谢你。

-奥斯卡

【问题讨论】:

    标签: iphone objective-c object release null


    【解决方案1】:

    假设你在你的类的接口中定义了一个指针myView

    @interface MyClass {
       UIView *myView;
    }
    
    @end
    

    然后在您的代码中,在某些时候,您可能会释放该变量:

    [myView release];
    

    在你这样做之后,指针myView 将不再指向 nil,而是指向一个可能不再存在的对象的内存地址(因为你刚刚释放了它)。所以,如果你在这之后碰巧做了一些事情,比如:

    [myView addSubview:otherView];
    

    你会得到一个错误。

    另一方面,如果你这样做:

    [myView release];
    myView = nil;
    ...
    [myView addSubview:otherView];
    

    addSubview 的调用不会产生任何负面影响,因为到 nil 的消息会被忽略

    因此,您可能会看到使用retain 属性的建议,例如:

    @property(retain) UIView *myView;
    

    然后在代码中,只需:

    self.myView = nil;
    

    通过这样做,合成访问器将释放旧对象并在一行代码中将引用设置为 nil。如果您想确保所有属性都被释放并设置为 nil,这可能会很有用。

    您永远不能忘记的一件事是,内存管理是通过retain release 调用完成的,而不是通过分配零。如果您有一个保留计数为 1 的对象,并将 nil 分配给它的唯一变量,您将泄漏内存:

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
    view = nil;
    // You just leaked a UIView instance!!!
    

    【讨论】:

    • 每个有抱负的 Cocoa 程序员都应该阅读这篇文章。我已经阅读了 Kochan、Hillegass 和 Apple 的文档,但我仍然花了将近 6 个月的时间来理解 pgb 在这里解释的一些概念。现在对我来说似乎很明显,但以前肯定不是。投票++
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多