2010-09-17 47 views
1

我正在測試我的應用程序,並突然它有EXC_BAD_ACCESS。現在這已經成爲一個半正規的事情,發生在一些構建上,而不是其他構件上。它還會在調試器中吐出很多錯誤,比如objc_msgSend_vtable5什麼會導致這樣的奇怪問題?不可預知的EXC_BAD_ACCESS和objc_msgSend_vtable5

+0

'objc_msgSend_vtable5'不是錯誤信息;它是Objective-C運行時中函數的名稱。堆棧跟蹤,這是你正在尋找的地方,只說明你的應用程序在崩潰時正在做什麼;它沒有提到它是什麼樣的崩潰。 – 2010-09-18 01:15:44

回答

1

看起來像是我的錯。爲了解決這個問題,我需要做的就是致電retain

+0

更確切地說,你有一個物體,你堅持但已經釋放,而不是保留。請參閱「內存管理編程指南」:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/調試這類事情的方法是使用Instruments的殭屍工具。 – 2010-09-18 01:14:18

1

我最近剛剛得到了同樣的錯誤。簡短版本:它發生是因爲我有一個對象具有一個已經發布的代理。確保您可以控制您分配的任何代理的生命週期,無論是通過Interface Builder還是其他代理。

長版本:當Objective-C運行時試圖向最終被釋放和釋放的對象發送消息時發生錯誤。這與將消息發送給無對象(完全有效的Objective-C操作)不同。在這些情況下,運行時間知道該對象爲零並相應地作出響應。相反,在這種情況下,Objective-C認爲它有一個真實,有效的對象與一個不包含對象的地址進行通信並將消息發送到一個地址。

在我的情況下,我有一個NSTextView類型的對象,它由Interface Builder連接到一個委託。當一個視圖或視圖控制器用NIB/XIB文件構建時,Cocoa按照指示掛鉤所有子視圖,包括連接你可能擁有的任何代理。

我的錯誤是我創建了一個NSView的子類,使它成爲NSTextViewDelegate,然後告訴Interface Builder將子NSTextView連接到該父視圖。但是,在我使用自己的NSViewController進行的各種操作中,我告訴Cocoa從視圖層次結構中刪除了NSView,並在稍後重新插入。

AppKit 特別是告訴您不要保留任何IBOutlets,但您可以通過簡單的賦值來保留這些IBOutlet。這是因爲AppKit爲你處理這些內存管理。我不知道通過讓視圖離開視圖層次一段時間,我觸發了AppKit來清理NSView。由於只有AppKit保留了視圖對象本身,所以關閉它進入以太網。釋放。

因爲我沒有直接控制NSTextView的委託,所以NSTextView現在指向一個已經發布的委託,即使它有一個有效的父視圖。下一次它試圖向其委託發送消息時,Objective-C運行時就會崩潰。

因此,確保委託人是您擁有的委託人,或者至少知道在不合時宜的情況下永遠不會發布委託人。

+0

我有一個類似的錯誤,如果發生這種情況,殭屍對象工具將是一個很好的方式來追蹤哪裏出了問題。看到這個答案的更多細節:http://stackoverflow.com/questions/11170614/viewcontroller-respondstoselector-message-sent-to-deallocated-instance-crash – 2013-01-27 10:46:57