2012-05-04 48 views
0

我有cocos2d類,如果我不釋放autoreleased對象(self.graphicsContainer),會產生內存泄漏。代碼:如何避免Cocos2d iOS上的類屬性內存泄漏

@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]; 
} 

任何人都知道我爲什麼要釋放它?據我所知,我不應該釋放自動釋放的對象?

+0

此代碼是否在後臺線程上運行? – MByD

+0

該代碼位於主層和主場景的init內部。沒有線程.. – knagode

回答

1

這正是我期望從該代碼中得到的行爲。由於的GraphicsContainer是一個保留的財產,行

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

...將保留的節點,所以你需要釋放它的dealloc中,你正在做的。你在那裏做什麼基本沒有問題。

有一點需要注意:這可能是有爭議的,但由於各種原因,在init和dealloc中使用屬性訪問器通常是不被贊同的。 This SO question有更多的信息(甚至更好:讀取主題的Mike Ash's excellent analysis)。

如果你陷入了「在初始化屬性訪問器/ dealloc的是壞的」營地(我),你可以把它改成這樣:

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

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

上面的代碼是完全等同於你在做什麼除了不調用屬性訪問器之外。