Значение, сохраненное во время его инициализации, никогда не читается - PullRequest
3 голосов
/ 23 апреля 2011

Я пытаюсь создать Игру, чтобы я мог изменить ее данные и сохранить их обратно. Я получаю две ошибки в комментариях. Почему я получаю эти ошибки. Я выделил Игру, поэтому я должен выпустить ее правильно Вот мой код для сохранения моей игры

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 Ответ

27 голосов
/ 23 апреля 2011
Game *newGame = [[Game alloc] init];//error 1

Вы создаете новый экземпляр, и вы им владеете, поскольку вы использовали +alloc.

newGame = [gamesArray objectAtIndex:gameNumber];

Вы получаете другой экземпляр из gamesArray и назначаете его той же переменной, которая былаиспользуется в предыдущей строке.Это означает, что вы потеряли ссылку на предыдущий объект и, поскольку у вас есть предыдущий объект, вы несете ответственность за его освобождение.Вы этого не делаете, поэтому вы пропускаете этот объект.

[newGame release];//error 2

В этот момент newGame указывает на экземпляр через gamesArray.Вы не являетесь владельцем этого устройства, поскольку не получили его через NARC, поэтому не следует его выпускать.

NARC: метод, имя которого содержит new, alloc, copy или retain.

Итог: вы пропускаете объект, созданный вами с помощью +alloc, и пытаетесь освободить объект, который вам не принадлежит.

...