2011-02-03 69 views
3

我得到一个坏的访问调用这行代码时(objc_msgsend)时:EXC_BAD_ACCESS合成(保留)属性设置为nil

self.currentGameTeam = nil; 

其中“currentGameTeam”的接口被定义为一个名为“MCState类“为:

MNAvailableTeamContext *currentGameTeam; 

我合成一个属性吧:

@property (retain) MNAvailableTeamContext *currentGameTeam; 

设置NSZombieEnable后d控制台显示:

*** -[MNAvailableTeamContext release]: message sent to deallocated instance 0x5b3eba0 

而且调试跟踪显示它来自于合成的setter代码中:

#3 0x0001fa96 in -[MCState setCurrentGameTeam:] at MCState.m:44 

我看了其他一些问题和线程,我无法找到一个适用于我的案例的答案。我不明白为什么如果我已经综合了这个属性并且我将它设置为零,为什么会有不好的访问。什么是特别奇怪的是,有在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 

其余的都是正常行为 - 只有当前游戏队给我带来麻烦。有任何想法吗?

+0

`self.currentGameTeam = nil;`位于哪里? – raidfive 2011-02-03 03:33:57

回答

7

某处,currentGameTeam正在释放,然后尝试将其设置为零。将保留属性设置为零意味着要调用一个版本。调用释放已释放的对象将导致EXC_BAD_ACCESS。这是与您启用NSZombies运行确认。

您可以使用Zombies工具运行乐器 - 它会为您提供更多有关导致僵尸呼叫的所有保留,发布和自动释放的详细信息。

0

你有没有名为currentGameTeam的伊娃?

+0

不好意思,但你是什么意思,我有“有”吗? – Matt 2011-02-03 03:26:14

+0

我的意思是在你的界面中声明了一个名为currentGameTeam的实例变量? – Max 2011-02-03 03:27:44

+0

是的 - 我以为我在顶部的问题中说过。它被声明为MCState类的实例变量。产生错误的代码也在MCState中。这是一个很大的类,所以我不想在这里明确地打印所有的代码。 – Matt 2011-02-03 03:30:44

0

我有一些错误,像这样的通常追踪他们到一个错字某处,我想键入currentGameUser但键入currentGameTeam所以我最终双重释放的对象之一,而不是释放另一个。我会尝试做一个Build and Analyze,如果没有找到任何东西Run with Performance Tool > Leaks

我这样说,因为你的代码,除非你声明,然后current*申报和综合性能看起来不错,看起来像一个矛盾所以有可能是其他地方,这种类型的接近,但是,不同的错别字可能发生。

-2

上次设置为零的时间应该已经设置为零。

所以下次设置为零应该不会有害。不知道为什么崩溃。