3

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

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”的值永远不会被读取。

第二个错误表示调用者此时不拥有的对象的引用计数减少不正确。

这是什么意思?请不要告诉我,您需要阅读内存管理并给我一个链接。请告诉我如何解决这个问题。

4

1 回答 1

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

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

newGame = [gamesArray objectAtIndex:gameNumber];

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

[newGame release];//error 2

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

NARC:名称包含newalloccopy或 is的方法retain

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

于 2011-04-23T04:30:27.513 回答