【问题标题】:Two iPhone memory management questions两个 iPhone 内存管理问题
【发布时间】:2009-08-25 01:48:04
【问题描述】:

我有两个问题。

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) 有两个类,ClassOne 和 ClassTwo。 ClassTwo 中的一个方法是:

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

第三类中还有方法

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

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

【问题讨论】:

    标签: iphone memory memory-leaks memory-management


    【解决方案1】:

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

    如果您在任何时候发送alloc、copy 或retain 消息,您必须稍后致电release 或autorelease。

    更多详情请见this excellent answer。

    【讨论】:

      【解决方案2】:

      数字 1 可能是正确的。

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

      当您调用 [ClassOne alloc] 时,您会得到一个保留计数为 1 的对象,并且您负责释放。

      self.O = ob;
      

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

      [ob release];
      

      现在self.O/ob 的保留计数为 1。此 release 与 alloc 匹配。剩余的保留计数归 self 所有,因此您必须记住在 self 完成后释放 O。

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

      很好。你记得释放O。现在O 将在self 被释放时完全释放。 (注意:你应该在dealloc的末尾调用[super dealloc]。)

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

      您应该在调用takeParam: 后释放ob。方法负责保留他们想要保留的对象。如果takeParam: 将ob 存储在classTwoOb 上,则应在方法返回之前保留它。如果不是,它不应该。

      在返回他们创建的对象的方法中使用autorelease。这使调用者有机会在需要时保留对象,或者如果长时间不需要它则不保留。例外情况是用于创建对象的方法,这些方法应始终称为 alloc、new 或 *copy*,并应返回引用计数为 1 的对象,使负责发布的调用者。

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

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        • 2011-02-12
        • 2010-10-20
        • 1970-01-01
        • 2011-05-03
        相关资源
        最近更新 更多