#xcode #memory-leaks #initialization #reference-counting
#xcode #утечки памяти #инициализация #подсчет ссылок
Вопрос:
Я пытаюсь создать игру, чтобы я мог изменить ее данные и сохранить их обратно. Я получаю две ошибки, которые находятся в закомментированных строках. Почему я получаю эти ошибки. Я выделил Игру, так что я должен был выпустить ее правильно. Вот мой код для сохранения моей игры
Game *newGame = [[Game alloc] init];//error 1
newGame = [gamesArray objectAtIndex:gameNumber];
[newGame setTheShotArray:shotArray];
[gamesArray replaceObjectAtIndex:gameNumber withObject:newGame];
NSString *path = [self findGamesPath];
[NSKeyedArchiver archiveRootObject:gamesArray toFile:path];
[newGame release];//error 2
Я получаю ошибку 1, в которой говорится, что значение, сохраненное в ‘NewGame’ во время его инициализации, никогда не считывается.
Вторая ошибка указывает на неправильное уменьшение количества ссылок на объект, который на данный момент не принадлежит вызывающей стороне.
Что это значит? И, пожалуйста, не говорите мне, что вам нужно прочитать об управлении памятью, а просто дайте мне ссылку. Подскажите, пожалуйста, как устранить проблему.
Комментарии:
1. что такое базовый класс для Game? Используете ли вы cocos2d для своей игры?
Ответ №1:
Game *newGame = [[Game alloc] init];//error 1
Вы создаете новый экземпляр и являетесь его владельцем с момента использования alloc
.
newGame = [gamesArray objectAtIndex:gameNumber];
Вы получаете другой экземпляр из gamesArray
и присваиваете его той же переменной, которая использовалась в предыдущей строке. Это означает, что вы потеряли ссылку на предыдущий объект и, поскольку вы являетесь владельцем предыдущего объекта, вы несете ответственность за его освобождение. Вы этого не делаете, поэтому вы пропускаете этот объект.
[newGame release];//error 2
В этот момент newGame
указывает на экземпляр через from gamesArray
. Оно вам не принадлежит, поскольку вы не получили его через NARC, следовательно, вам не следует его выпускать.
NARC: метод, имя которого содержит new
, alloc
copy
или является retain
.
Итог: происходит утечка объекта, который вы создали с помощью alloc
, и вы пытаетесь освободить объект, который вам не принадлежит.