【问题标题】:Value stored during its initialization is never read初始化期间存储的值永远不会被读取
【发布时间】:2011-08-11 08:30:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • Game 的基类是什么?你的游戏使用 cocos2d 吗?

标签: xcode memory-leaks initialization reference-counting


【解决方案1】:
Game *newGame = [[Game alloc] init];//error 1

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

newGame = [gamesArray objectAtIndex:gameNumber];

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

[newGame release];//error 2

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2018-07-26
    • 2015-07-26
    • 2012-01-19
    相关资源
    最近更新 更多