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

Bla*_*end 3 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
Run Code Online (Sandbox Code Playgroud)

我得到错误1,表示在初始化期间存储到'newGame'的值永远不会被读取.

第二个错误说明调用者此时不拥有的对象的引用计数的不正确的减少.

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

小智 27

Game *newGame = [[Game alloc] init];//error 1
Run Code Online (Sandbox Code Playgroud)

您创建了一个新实例,并且在您使用之后就拥有了它+alloc.

newGame = [gamesArray objectAtIndex:gameNumber];
Run Code Online (Sandbox Code Playgroud)

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

[newGame release];//error 2
Run Code Online (Sandbox Code Playgroud)

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

NARC:名称中包含的方法new,alloc,copy,或retain.

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