У меня проблема с объектом 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]) {
...
}
}
Выполнение данного запроса для сом е время (никогда не сразу) генерирует ошибку в консоли:
[GameCharacter playerId]: сообщение, отправленное высвобождены например 0x4e47560
С NSZombieEnabled trick мне удалось отследить объект (ы) что вызывает проблему, но я до сих пор не могу понять , почему этот объект освобождается. Поиск моего кода для «release»/«dealloc» не дает никаких подсказок.
Я попытался удалить «освобождение» (и даже добавить «сохранить»!) В цикл alloc/init (см. Выше), он, как представляется, продлевает время работы приложения, но не полностью устраняет проблему ,
Любые советы были бы высоко оценены!
EDIT
Благодаря quixoto, Оли, Эйко, дц., Я понял, что это мой 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
@Tom - в каких классах эти фрагменты кода живут? Похоже, у вас есть код в другом месте, который взаимодействует с characterArray, что приводит к dealloc. Может быть связано с удалением объекта из массива, например, это происходит? –
Я бы внимательно посмотрел на characterArray и когда он будет освобожден. Так как у вас есть функция удобства, чтобы вернуть защитник, вы можете легко удерживать его после characterArray и все его содержимое освобождается.Если у вас не было удобного метода (и я не вижу его преимущества здесь), вы можете вместо этого просто взять защитник из массива всякий раз, когда вам это нужно, и быть более уверенным в том, что characterArray по-прежнему требуется и действителен в этот момент. –