0

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

@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 对象发送消息。但有人告诉我相反。

有人可以启发我吗?

谢谢你的建议 !!

4

2 回答 2

0

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

不,

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

2)在dealloc你只是将这个指针设置为nil(在dealloc中做相当没有意义的事情) - 对象本身没有被释放或/和被释放。

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

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

于 2011-04-02T16:37:20.900 回答
0

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

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

于 2011-04-02T17:42:46.497 回答