0

即使我们不拥有(alloc/new/copy)那个 ivar,我们是否必须在 dealloc 中释放 ivar?

例如,这是正确的吗?

-(void)dealloc {
    [_aUIImageIvar release];

    [super dealloc];
}

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

2 回答 2

4

不,事实上你不能释放它。奇怪的是,您没有将它保留在构造函数中。此外,除非您有充分的理由不这样做,否则您可能应该转而使用 ARC。

于 2013-11-05T02:21:15.130 回答
1

不,您应该只release保留您保留(或以其他方式拥有)的那些项目。但是创建一个自动释放对象并且对它不做任何事情来保留它是没有意义的,因为它会在池耗尽时被释放。

考虑你的行:

_aUIImageIvar = [UIImage imageWithData:data];

这将返回一个自动释放对象,并且正如您所指出的,因为您不拥有它(例如,您不拥有它或使用/retain创建它),当自动释放池耗尽时(即可能在您使用它之前),它将被释放) 你最终会得到一个指向已释放对象的悬空指针。allocinit

显然,您可以通过添加 a 来解决此问题,但使用/retain创建它会更合乎逻辑:allocinit

_aUIImageIvar = [[UIImage alloc] initWithData:data];

然后你会得到一个对象retainCount,它会为你保留(然后你的dealloc方法就会正确)。但是创建一个自动释放对象的构造,而不是用它做任何事情retain,是没有意义的。

于 2013-11-05T02:22:50.017 回答