代码之家  ›  专栏  ›  技术社区  ›  Oscar Gomez

目标C:何时将对象引用设置为零

  •  8
  • Oscar Gomez  · 技术社区  · 15 年前

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

    -奥斯卡

    1 回复  |  直到 15 年前
        1
  •  41
  •   pgb    15 年前

    假设你有一个指针 myView

    @interface MyClass {
       UIView *myView;
    }
    
    @end
    

    [myView release];
    

    myView

    [myView addSubview:otherView];
    

    你会得到一个错误。

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

    addSubview 不会产生任何负面影响,因为 忽略发送给nil的消息 .

    retain 属性,例如:

    @property(retain) UIView *myView;
    

    然后在代码中,只需执行以下操作:

    self.myView = nil;
    

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

    有一件事你永远不能忘记,那就是内存管理是通过 保持 release 调用,而不是通过分配nil。如果您有一个retain count为1的对象,并将nil分配给它的唯一变量,则会泄漏内存:

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