永远不会读取在初始化期间存储的值

时间:2011-04-23 04:25:05

标签: xcode memory-leaks initialization reference-counting

我正在尝试创建一个游戏,以便我可以更改其数据并将其保存回来。我在评论行上得到两个错误。为什么我会收到这些错误。我分配了游戏,所以我应该将其正确发布。这是我保存游戏的代码

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 个答案:

答案 0 :(得分:27)

Game *newGame = [[Game alloc] init];//error 1

您创建了一个新实例并且拥有它,因为您已经使用了+alloc

newGame = [gamesArray objectAtIndex:gameNumber];

您从gamesArray获取另一个实例,并将其分配给上一行中使用的同一变量。这意味着您已经丢失了对前一个对象的引用,并且由于您拥有前一个对象,因此您负责释放它。你没有,所以你正在泄漏那个对象。

[newGame release];//error 2

此时newGame通过gamesArray指向实例。你没有拥有它,因为你没有通过NARC获得它,因此你不应该发布它。

NARC:一个名称包含newalloccopyretain的方法。

底线:您正在泄漏您通过+alloc创建的对象,而您正在尝试释放您不拥有的对象。