【问题标题】:Question about Memory Management in iOS关于iOS内存管理的问题
【发布时间】:2011-04-02 16:21:52
【问题描述】:

我有一个关于内存管理的问题。我有一个我之前在 init* 方法中分配的实例变量。在我的程序中,我保留了这个对象。 在我的 dealloc 方法中,如果我将此对象设置为 nil,他会被正确地释放吗? 让我举个例子。这是 A.h 类:

@interface A: NSObject {
  B *bvariable;
}
-(id) init;

和他的实现:

 @implementation A

  -(id) init: { 
      bvariable= [[B alloc] init];


       /**
        *  Let say for some reason, I called   
       */   
       [bvariable retain];
   }
}

-(void) dealloc {
     bvariable = nil;
     [super dealloc];
}

我的问题是,当 GC 将在 A 类上调用 dealloc 时,bvrariable 会被正确释放吗?

我的猜测是否定的,因为我保留了这个对象,所以我必须调用 release 两次才能释放该对象。将对象设置为 nil 不会释放它们,因为我仍然向 bvrariable 对象发送消息。 但有人告诉我相反。

有人可以启发我吗?

谢谢你的建议!!

【问题讨论】:

    标签: ios memory-management memory-leaks dealloc


    【解决方案1】:

    我的问题是 GC 何时会调用 A类上的dealloc,将 bvrariable 是否被正确释放?

    不,

    1) iOS 内存管理中不使用 GC。

    2) 在dealloc 中,您只需将此指针设置为nil(在dealloc 中做这件事毫无意义)- 对象本身不会被释放或/和解除分配。

    我的猜测是否定的,因为我 保留了这个对象,所以我必须调用 释放两次以释放该对象。

    没错。顺便说一句,在alloc 之后,我看不出有任何合理的理由保留这个对象——你已经声明了它的所有权。

    【讨论】:

      【解决方案2】:

      通常每个以 alloc/init/copy/new 开头的方法都应该返回一个保留对象。如果您再次保留此对象,则保留计数为 2。为了完全释放该对象,您必须释放两次。

      只有在使用垃圾回收 (GC) 时才适用于将对象设置为 nil 时释放对象的故事。这目前不适用于 iOS,仅适用于 Mac OS。

      【讨论】:

      • alloc/init/retain/copy all 返回 +1 保留计数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多