在dealloc期间解释`self`用法?

时间:2010-06-08 17:51:34

标签: iphone objective-c

我试图锁定我对Objective-C中正确内存管理的理解。

我已经养成了明确声明self.myProperty而不仅仅是myProperty的习惯,因为我偶尔会遇到一个属性不会被设置为我想要的引用的情况。

现在,我正在阅读有关发布IBOutlets的Apple文档,他们说在nil期间所有商店都应设置为dealloc。因此,我按照以下方式将其放置到位,并且经历了崩溃:

- (void)dealloc {
    [self.dataModel close];
    [self.dataModel release], self.dataModel = nil;
    [super dealloc];
}

所以,我尝试取出“自我”引用,如下:

- (void)dealloc {
    [dataModel close];
    [dataModel release], dataModel = nil;
    [super dealloc];
}

第二个系统似乎按预期工作。但是,它让我有点困惑。为什么self会导致崩溃,当我认为self是一个相当温和的参考时,更多地用作形式而不是其他任何东西?此外,如果self在这种情况下不合适,那么我必须问:什么时候应该包含self个引用,什么时候不应该?

2 个答案:

答案 0 :(得分:1)

[self.dataModel release]会发布您不拥有的dataModel引用。后续self.dataModel = nil相当于调用[self setDataModel:nil],而setter方法本身会释放您已经完成的dataModel

最简单的事情是self.dataModel = nil

作为一个更普遍的观点,self.blah不仅仅是一种礼貌的访问字段的方式。它调用一种方法,可能会产生副作用。这些副作用的目的应该是让生活更安全,更容易。但是,如果你忘记了调用该方法,那么它可能会导致混淆,就像这里一样。

作为一项规则,您应该构造属性方法以封装内存管理等棘手的东西 - 只要您正确声明属性属性 - 然后将它留给它们,默认实现就会这样做。混合和匹配您自己的内存管理和属性方法的内存管理几乎总会让您最终绊倒。

答案 1 :(得分:1)

在看到Apple示例代码和iphone开发书后,我采用了以下内容。

在'viewDidUnload'中将outlet设置为nil(使用SELF访问器) 以'dealloc'(无自我)发布它们

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
    self.button = nil
}


- (void)dealloc {
   // no SELF
   [button release];   // UI objects
   [images release];   // model objects
}