【问题标题】:What happens exactly, when I set an property to nil in the dealloc method?当我在 dealloc 方法中将属性设置为 nil 时,究竟会发生什么?
【发布时间】:2009-04-24 10:06:27
【问题描述】:

例子

-(void)dealloc {
    self.myOutletProperty = nil;
    [super dealloc];
}

我猜会调用某种虚拟二传手。但是这里到底发生了什么?为什么是零?

【问题讨论】:

  • 在任何意义上都不需要它是“虚拟的”。调用-dealloc时,对象依然存在。

标签: objective-c iphone cocoa-touch


【解决方案1】:

您应该知道,该属性只是语法糖。

例如:

@property(nonatomic, retain) NSString *myString;

将转换为

- (NSString*)myString { 
    return myString; 
}

- (void)setMyString:(NSString*)newString {
    if (myString != newString) {
        [myString release];
        myString = [newString retain];
    }
}

所以如果你以这种方式声明@property,它实际上会释放

【讨论】:

    【解决方案2】:

    1.如果属性类型为“复制”或“保留”,则

    self.myOutletProperty = nil;与[myOutletProperty release]相同;

    2.如果属性类型为“assign”,则

    self.myOutletProperty = nil;什么都不做

    【讨论】:

      【解决方案3】:

      要记住的一件事是,即使将您的属性设置为 nil 也可以正常工作,我建议您改为在您的 dealloc 方法中调用 [object release]。这样,如果您编写我​​们自己的 setter 方法来引用另一个 ivar(可能已经发布),或者您在其他地方的该属性上注册了 KVO 通知,那么您是安全的。

      【讨论】:

        【解决方案4】:

        Nil 与 null 相同,但用于对象。这意味着没有对象。

        点语法与调用 [self setMyOutletProperty:nil] 相同。

        因此,您只需从某个属性中删除一个对象。含义取决于您所谈论的属性。

        【讨论】:

          猜你喜欢
          • 2013-06-13
          • 2015-12-25
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多