调用这行代码时,我得到一个错误的访问权限(objc_msgsend):
self.currentGameTeam = nil;
其中“currentGameTeam”在名为“MCState”的类的接口中定义为:
MNAvailableTeamContext *currentGameTeam;
我为它合成了一个属性:
@property (retain) MNAvailableTeamContext *currentGameTeam;
设置NSZombieEnabled后,控制台显示:
*** -[MNAvailableTeamContext release]: message sent to deallocated instance 0x5b3eba0
调试器跟踪显示它来自合成的setter代码:
#3 0x0001fa96 in -[MCState setCurrentGameTeam:] at MCState.m:44
我已经查看了其他几个问题和主题,我找不到适合我案例的答案。我不明白为什么如果我合成了属性并且我将它设置为nil会有一个糟糕的访问。特别奇怪的是MCState中至少有3个其他属性以与currentGameTeam完全相同的方式定义和使用,唯一的区别是它们是不同的类型:
MNUserContext *storedUser;
MNActiveGameContext *storedGame;
MNAvailableUserContext *storedGameUser;
MNAvailableTeamContext *storedGameTeam;
和
@property (retain) MNUserContext *currentUser;
@property (retain) MNActiveGameContext *currentGame;
@property (retain) MNAvailableUserContext *currentGameUser;
@property (retain) MNAvailableTeamContext *currentGameTeam;
和
@synthesize currentUser;
@synthesize currentGame;
@synthesize currentGameUser;
@synthesize currentGameTeam;
最后
self.currentUser = userContext;
self.currentGame = nil;
self.currentGameUser = nil;
self.currentGameTeam = nil; // Error occurs here
其余的一切都正常 - 只有currentGameTeam给我带来麻烦。有什么想法吗?
答案 0 :(得分:7)
在某处,currentGameTeam
在您尝试将其设置为nil之前被释放。将保留属性设置为nil意味着要调用的版本。在已发布的对象上调用release将导致EXC_BAD_ACCESS
。启用NSZombies时可以确认这一点。
您可以使用Zombies工具与乐器一起运行 - 它将为您提供有关僵尸呼叫前所有保留,释放和自动释放的更多详细信息。
答案 1 :(得分:0)
你有名为currentGameTeam的ivar吗?
答案 2 :(得分:0)
我有一些像这样的错误,通常会将它们追踪到一个错字的某个地方,我打算键入currentGameUser
但是键入currentGameTeam
所以我最终双重释放其中一个对象不释放另一个。我会尝试Build and Analyze
,如果找不到任何内容请尝试Run with Performance Tool > Leaks
。
我这样说是因为你的代码看起来很好,除了你声明stored*
然后声明和合成current*
的属性,这看起来像一个不一致所以可能有其他地方这种类型的关闭 - 但 - 可能发生了不同的拼写错误。
答案 3 :(得分:-2)
上次设置为nil时应将其设置为nil。
所以下次设置为nil应该没有害处。不知道为什么会崩溃。