我正在尝试创建一个游戏,以便我可以更改其数据并将其保存回来。我在评论行上得到两个错误。为什么我会收到这些错误。我分配了游戏,所以我应该将其正确发布。这是我保存游戏的代码
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'的值永远不会被读取。
第二个错误说明调用者此时不拥有的对象的引用计数的不正确减少。
这是什么意思?请不要告诉我,你需要阅读内存管理,并给我一个链接。告诉我如何解决问题。
答案 0 :(得分:27)
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
创建的对象,而您正在尝试释放您不拥有的对象。