即使我们不拥有(分配/新/复制)ivar,我们必须在dealloc中释放ivar吗?

时间:2013-11-05 02:02:55

标签: ios objective-c memory-management

即使我们不拥有(分配/新/复制)ivar,我们必须在dealloc中发布ivar吗?

例如,这是正确的吗?

-(void)dealloc {
    [_aUIImageIvar release];

    [super dealloc];
}

-(id)init{
    self = [super init];
    if (self) {
        _aUIImageIvar = [UIImage imageWithData:data];
    }
}

2 个答案:

答案 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来做任何事情的构造是没有意义的。