即使我们不拥有(分配/新/复制)ivar,我们必须在dealloc中发布ivar吗?
例如,这是正确的吗?
-(void)dealloc {
[_aUIImageIvar release];
[super dealloc];
}
-(id)init{
self = [super init];
if (self) {
_aUIImageIvar = [UIImage imageWithData:data];
}
}
答案 0 :(得分:4)
没有。实际上你不能释放它。奇怪的是你没有在构造函数中保留它。此外,除非你有充分的理由不这样做,否则你应该转向使用ARC。
答案 1 :(得分:1)
不,你应该只release
那些你保留(或拥有)的项目。但是创建一个自动释放对象没有任何意义,并且不会保留它,因为它会在池耗尽时释放。
考虑你的行:
_aUIImageIvar = [UIImage imageWithData:data];
返回一个自动释放对象,正如您所指出的那样,因为您不拥有它(例如,您没有retain
它或使用alloc
/ init
创建它,当自动释放池耗尽时(即可能在你使用它之前)它将被释放,你将最终得到一个指向解除分配对象的悬空指针。
显然,您可以通过添加retain
来解决此问题,但使用alloc
/ init
创建它更合乎逻辑:
_aUIImageIvar = [[UIImage alloc] initWithData:data];
然后你会得到一个retainCount
为1的对象,它将被保留(然后你的dealloc
方法将是正确的)。但是创建一个自动释放的对象,而不是用retain
来做任何事情的构造是没有意义的。