2011-04-02 49 views
0

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

@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将调用的dealloc对A类,将bvrariable正确释放?

我的猜测是没有,因为我保留这个对象,所以我必须拨打版本两次释放该对象。将对象设置为零将不会释放它们,因为我仍然将消息发送给可移动对象。 但有人告诉我相反。

有人能让我想起吗?

感谢您的咨询!

回答

0

我的问题是,当GC将调用A类 的dealloc,将 bvrariable正确释放?

否,

1)GC未在IOS存储器,上海管理使用。

2)在dealloc中,您只需将此指针设置为nil(在dealloc中做的事情非常没有意义) - 对象本身不会释放或/和释放。

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

没错。顺便说一句,我看不到任何理智的原因保留这个对象后alloc - 你已经声称拥有它。

0

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

有关将对象设置为零时释放对象的故事仅适用于使用垃圾收集(GC)的情况。目前iOS仅支持Mac OS。

+0

alloc/init/retain/copy全部返回+1保留计数。 – 2011-12-28 10:12:31