两个iPhone内存管理问题

时间:2009-08-25 01:48:05

标签: iphone memory memory-leaks memory-management

我有两个问题。

1)其中哪一个会释放ob?

- (void){
  ClassOne *ob = [[ClassOne alloc] init]; // should I use autorelease here?
  self.O = ob;
   [ob release]; // is this correct ??
}

-(void)dealloc{
 [O release]; // is this correct?
}

2)有两个类ClassOneClassTwoClassTwo中的方法是:

- (void) takeParam:(ClassOne *pt) {
  // something going here
}

并且在第三类中有方法

- (void) runIt {
   ClassOne *ob = [[ClassOne alloc] init];
   [classTwoOb takeParam:ob];
}

我应该在哪里调用ClassOne对象的发布?

2 个答案:

答案 0 :(得分:3)

-release方法仅减少相关对象的保留计数。当保留计数达到零时,运行时将调用-dealloc

如果您发送alloccopyretain消息,则必须稍后致电releaseautorelease

有关详细信息,请参阅this excellent answer

答案 1 :(得分:2)

1号可能是正确的。

ClassOne *ob = [[ClassOne alloc] init]; // do i should use autorelease here ?

当你致电[ClassOne alloc]时,你会得到一个保留计数为1的对象,你负责释放。

self.O = ob;

假设self.Oretain属性,而不是assign属性,self.O / ob的保留计数为2.

[ob release];

现在self.O / ob的保留计数为1.此releasealloc匹配。剩余的保留计数归self所有,因此您必须记得在O完成后才发布self

-(void)dealloc{
    [O release]; // is this correct ??
}

好。你记得发布O。现在O将在self被解除分配时完全释放。 (注意:您应在[super dealloc]结束时致电dealloc。)

- (void) runIt {
   ClassOne *ob = [[ClassOne alloc] init];
   [classTwoOb takeParam:ob];
}

您应在致电ob后发布takeParam:。方法负责保留他们想要保留的对象。如果takeParam:ob存储在classTwoOb上,则应在方法返回之前将其保留。如果没有,它不应该。

在返回已创建对象的方法中使用autorelease。这使得调用者有机会在需要时保留该对象,如果不长时间则不需要它。例外情况是用于创建对象的方法,应始终将其称为alloc new *copy*,并应返回带有引用的对象计数为1,使调用者负责释放。

要真正学习Objective-C内存管理,我建议您阅读“内存管理编程指南”,尤其是Memory Management Rules部分。