2011-02-03 65 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

上次設置爲零的時間應該已經設置爲零。

所以下次設置爲零應該不會有害。不知道爲什麼崩潰。