0

如果我不释放自动释放的对象(self.graphicsContainer),我有 cocos2d 类会产生内存泄漏。代码:

@property (nonatomic, retain) CCNode * graphicsContainer; // I create property

@synthesize graphicsContainer = _graphicsContainer; // I synthesize it

-(id)init 
{
    if ((self = [super init])) {
        self.graphicsContainer = [CCNode node]; // which returns autoreleased object!
    }
    return self;
}

-(void) dealloc 
{
    [self.graphicsContainer release]; // If I do not release it I get memory leak warning!
    [super dealloc];
}

有谁知道我为什么要发布它?据我所知,我不应该释放自动释放的对象?

4

1 回答 1

1

这正是我对该代码所期望的行为。因为 graphicsContainer 是一个保留属性,所以该行

self.graphicsContainer = [CCNode node]; // which returns autoreleased object!

...将保留该节点,因此您需要在执行时将其释放到 dealloc 中。你在那里做的事情基本上没有错。

一个警告:这可能是有争议的,但由于各种原因,通常不赞成在 init 和 dealloc 中使用属性访问器。 这个 SO question对此有更多信息(更好的是:阅读Mike Ash对该主题的出色分析)。

如果您属于“init/dealloc 中的属性访问器不好”阵营(我愿意),您可以将其更改为:

-(id)init 
{
    if ((self = [super init])) {
        _graphicsContainer = [[CCNode node] retain]; // which returns autoreleased object!
    }
    return self;
}

-(void) dealloc 
{
    [_graphicsContainer release];
    [super dealloc];
}

上面的代码与您正在执行的操作完全相同,只是它没有调用属性访问器。

于 2012-05-05T01:05:08.833 回答