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語句中的行是內存泄漏的地方。該函數僅在對象生命週期中調用一次。任何想法爲什麼這會導致內存泄漏?
我曾經嘗試這樣做,這些線路都沒有了intially他們剛剛沿途加入,同時試圖解決這個問題。 – Tiddly 2010-08-23 11:25:10
其實這是問題所在。事實證明,當我嘗試過它釋放實際上並沒有被調用的對象。一旦我刪除了保留,那麼它工作正常。謝謝。 – Tiddly 2010-08-23 11:45:46