我试图锁定我对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
个引用,什么时候不应该?
答案 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
}