2013-11-05 63 views
0

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

例如,这是正确的吗?

-(void)dealloc { 
    [_aUIImageIvar release]; 

    [super dealloc]; 
} 

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

不可以。不要释放你不拥有的东西。但为什么你不保留这个形象? – rmaddy

+0

谢谢@rmaddy,我忘了保留它...因为我没有使用setter,所以很容易忘记保留。 – Cong

+0

简单的规则,如保留 - 释放配对容易与其他事物混淆... – Cong

回答

1

不,你应该只有release那些你保留(或者拥有)的物品。但是创建一个autorelease对象并没有任何意义,它会保留它,因为当池被耗尽时它会被释放。

考虑您的线路:

_aUIImageIvar = [UIImage imageWithData:data]; 

返回一个自动释放的对象,正如你指出的,因为你不拥有它(例如,你不retain或用创建alloc/init) ,当autorelease池被耗尽时(也就是在你使用它之前)它会被释放,并且你最终会得到一个指向释放对象的悬挂指针。

很明显,你可以通过添加retain解决这个问题,但它会更合乎逻辑与alloc/init创建:

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

然后你会得到一个的retainCount一个对象,它将保留给你(然后你的方法将是正确的)。但是创建一个自动释放对象的构造,并没有对它做任何事情,这是没有意义的。

+0

对于@Rob,其实我已经使用了属性'_profileImage',所以我可以使用'[self setProfileImage:[UIImage imageWithData:data] ];'隐式保留它。 – Cong

+0

但是'_aUIImageIvar = [[UIImage alloc] initWithData:data];'如果不使用setter则更符合逻辑。 – Cong

+0

@congliu在这种情况下,只需在'dealloc'中删除'release'就可以了。当'profileImage'被释放时(你没有向我们显示,但我假设你释放了这个),这将减少这个图像的保留计数。 – Rob

4

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