2011-02-23 26 views
1

我在Cocos2d中有一個iPhone應用程序,由於內存問題,它有時會在實際設備上崩潰。在Cocos2d iPhone應用程序中未完全發佈的場景 - 調試

我迄今發現的是,場景,切換時,沒有完全釋放 - 在[retainCount]對他們來說是有點4-10 :)

dealloc方法不會被調用,然後我假設,當我切換場景幾次時,內存問題就會出現。

我想知道 - 我應該在哪裏放鬆現場?既然它有多少個孩子,我想我應該對他們進行清理。但事實證明,從圖層中移除所有的孩子並不會減少它的保留數量。我加了這樣一段代碼到我的cleanup方法:

- (void) cleanup { 
    while ([self.children count] > 0) { 
     CCLOG(@"child: %d - %@ rc: %d", 0, [self.children objectAtIndex:0], [[self.children objectAtIndex:0] retainCount]); 
     [self removeChild:[self.children objectAtIndex:0] cleanup:YES]; 
    } 
    [super cleanup]; 
} 

但隨後[self retainCount]方法仍然返回的數則1或0,和我的dealloc不會被調用。

爲了正確地釋放這些孩子,我應該做些什麼?如果我將自己的子類CCSprite作爲子項添加,那麼我應該在該類中執行一些具體的操作嗎?releasedealloc方法,那麼只需調用它的[super]方法?

回答

1

通常你不必自己釋放你的孩子。你如何添加你的孩子?

4

不要叫retainCount

retainCount是無用的,因爲你已經發現,與複雜的框架打交道時。有任何數量的內部實現細節可能導致保留計數在任何給定時間成爲意外值,而不會指出錯誤。

你應該釋放場景來平衡你保留場景的次數,不多也不少。

如果您釋放的次數超過您保留的次數,那麼您的應用可能會在您[可能意外]修復真正問題時崩潰。

一般來說在處理視圖,圖層或精靈等項目的層次結構時,將刪除根視圖/圖層/精靈,並且刪除操作將拆除層次結構(包括根據需要釋放)。

這假定您沒有保留層次結構中的任何內容。如果你有,那麼你還需要在root被移除和釋放時釋放這些引用。