2010-08-23 100 views
0

我想追蹤我的cocos2D遊戲中的內存泄漏。我使用儀器運行遊戲來查找是什麼導致了泄漏,並且問題的大部分似乎來自這種方法。試圖追蹤在cocos2D應用程序中的內存泄漏

-(void)setColour:(int)c { 

switch (c) { 
    case RED: 

     images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble_small.png"]];   
     images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble_select_small.png"]]; 
     images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble.png"]]; 
     images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"red_bubble_select.png"]]; 

     break; 
    case BLUE: 

     images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble_small.png"]]; 
     images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble_select_small.png"]]; 
     images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble.png"]]; 
     images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"blue_bubble_select.png"]]; 

     break; 
    case GREEN: 

     images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble_small.png"]]; 
     images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble_select_small.png"]]; 
     images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble.png"]]; 
     images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"green_bubble_select.png"]]; 

     break; 
    case PURPLE: 

     images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble_small.png"]]; 
     images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble_select_small.png"]]; 
     images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble.png"]]; 
     images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"purple_bubble_select.png"]]; 

     break; 
    case YELLOW: 

     images[SMALL_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble_small.png"]]; 
     images[SMALL_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble_select_small.png"]]; 
     images[LARGE_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble.png"]]; 
     images[LARGE_SELECTED_BUBBLE_IMAGE] = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:(NSString *)@"yellow_bubble_select.png"]]; 

     break; 

} 

[images[SMALL_BUBBLE_IMAGE] retain]; 
[images[SMALL_SELECTED_BUBBLE_IMAGE] retain]; 
[images[LARGE_BUBBLE_IMAGE] retain];  
[images[LARGE_SELECTED_BUBBLE_IMAGE] retain]; 

[small_bubble setTexture:images[SMALL_BUBBLE_IMAGE]]; 
[large_bubble setTexture:images[LARGE_BUBBLE_IMAGE]]; 

colour = c; 

} 

所有此功能的作用是改變由一個對象所使用的圖像,每個圖像對象具有與之相關聯的圖像4,所以我將它們存儲在陣列中。我曾經想過,我使用的任何指針都不會被保留,而是自動發佈,但是後來我發現maby並不是這種情況。如果我沒有先在對象上調用保留,而是在對象上調用釋放,那麼該項目就會崩潰,這就是爲什麼保留圖像的線在那裏。

我在dealloc函數中調用了這些行;

[images[SMALL_BUBBLE_IMAGE] release]; 
[images[SMALL_SELECTED_BUBBLE_IMAGE] release]; 
[images[LARGE_BUBBLE_IMAGE] release]; 
[images[LARGE_SELECTED_BUBBLE_IMAGE] release]; 

儀器告訴我case語句中的行是內存泄漏的地方。該函數僅在對象生命週期中調用一次。任何想法爲什麼這會導致內存泄漏?

回答

1

當你創建你的紋理時,你正在分配它們,那麼你明確地保留它們。 嘗試刪除線:

[images[SMALL_BUBBLE_IMAGE] retain]; 
[images[SMALL_SELECTED_BUBBLE_IMAGE] retain]; 
[images[LARGE_BUBBLE_IMAGE] retain];  
[images[LARGE_SELECTED_BUBBLE_IMAGE] retain]; 
+0

我曾經嘗試這樣做,這些線路都沒有了intially他們剛剛沿途加入,同時試圖解決這個問題。 – Tiddly 2010-08-23 11:25:10

+0

其實這是問題所在。事實證明,當我嘗試過它釋放實際上並沒有被調用的對象。一旦我刪除了保留,那麼它工作正常。謝謝。 – Tiddly 2010-08-23 11:45:46