我有一個Objective-C對象(在iOS遊戲應用程序中)正在被神祕解除分配的問題。爲什麼我的Objective-C對象被釋放?
目的是被實例化,像這樣一個GameCharacter實例:
for (int c = 0; c < kNrOfGuards; c++) {
GameCharacter* guard = [[GameCharacter alloc] initGuard:self sprite:guardSprite];
[characterArray addObject:guard];
[guard release];
}
我也有一個方便的方法用於查找一個GameCharacter:
- (GameCharacter*)findCharacterWithIndex:(int)index {
return [characterArray objectAtIndex:index];
}
而生成錯誤看起來像代碼:
for (int c = 0; c < [self characterCount]; c++) {
GameCharacter* tempCharacter = [self findCharacterWithIndex:c];
if (tempCharacter.playerId == playerIndex]) {
...
}
}
運行此代碼for som E時間(從未立即)生成在控制檯一個錯誤:
[GameCharacter playerId]:發送到釋放的實例0x4e47560
隨着NSZombieEnabled trick我已經成功消息追查(多個)對象那是造成這個問題的原因,但我仍然不明白爲什麼這個對象正在被釋放。搜索我的代碼「釋放」/「dealloc」不會產生任何線索。
我已經嘗試刪除「釋放」(甚至添加一個「保留」!)到分配/初始化循環(見上),它似乎延長了應用程序可以運行的時間,但並未完全刪除問題。
任何提示將不勝感激!
編輯
感謝quixoto,OLIE,英子,TC,我已經想通了,這是一個正在釋放我GameCharacter對象,但是我還是不太明白爲什麼。下面是跟蹤日誌按時間倒序:
#0 -[GameCharacter dealloc]
#1 objc_setProperty
#2 -[TiledGroundLayer setSelectedCharacter:]
#3 -[TiledGroundLayer selectNextCharacterForPlayer:searchStep:]
#4 -[GameScene selectNextCharacter:]
#5 -[GameScene endTurn]
#6 -[HUDLayer onClickDone:]
這裏會發生什麼事,是用戶點擊「完成」,在屏幕上選擇的字符改變,因此財產selectedCharacter
上TiledGroundLayer(步驟#2-4 )。由於selectedCharacter
擁有以前的GameCharacter對象,因此它似乎正在被釋放。但爲什麼它沒有被NSMutableArray([characterArray addObject:guard];
)正確保留?
您的characterArray變量創建爲'[NSMutableArray array]'還是'[[NSMutableArray init] alloc]'? – tidwall 2010-09-24 22:11:55
@Tom - 這些代碼片段在哪些類中生存?它看起來像其他地方的代碼與導致dealloc的characterArray交互。可能與從數組中刪除對象相關 - 例如 - 是否發生? – 2010-09-24 22:14:27
我會仔細看看characterArray以及何時釋放它。既然你有一個方便的函數來返回一個守衛,你可以在characterArray及其所有內容被釋放後輕鬆地保留它。如果你沒有方便的方法(我不能在這裏看到它的好處),你可以在需要的時候從數組中獲得警衛,並且更確定characterArray在那時仍然是必需的和有效的。 – 2010-09-24 23:03:07