2014-09-28 61 views
1

自更新至xcode6 iOS8後,我發生了一次崩潰。日誌爲「 2014-09-28 14:53:34.069 ViewDemo [35448:3262351] *因未捕獲的異常'NSInternalInconsistencyException'而終止應用程序,原因:'RedView類的實例0x7f9750c1c410被釋放,而鍵值觀察者仍然。它註冊現有的觀測信息:( 語境:爲0x0,物業:0x7f9750c1b910> )」 *第一擲調用堆棧: (關於addObserver的ios8崩潰:

0 CoreFoundation      0x00000001022e93f5 __exceptionPreprocess + 165 
1 libobjc.A.dylib      0x0000000101f82bb7 objc_exception_throw + 45 
2 CoreFoundation      0x00000001022e932d +[NSException raise:format:] + 205 
3 Foundation       0x0000000101b65af2 NSKVODeallocate + 317 
4 UIKit        0x000000010273fc97 -[UIView(Hierarchy) removeFromSuperview] + 633 
5 UIKit        0x0000000102733d19 -[UIView dealloc] + 404 
6 libobjc.A.dylib      0x0000000101f978cd _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 591 
7 CoreFoundation      0x00000001021e0346 _CFAutoreleasePoolPop + 22 
8 CoreFoundation      0x0000000102214473 __CFRunLoopRun + 2051 
9 CoreFoundation      0x0000000102213a06 CFRunLoopRunSpecific + 470 
10 GraphicsServices     0x00000001058b19f0 GSEventRunModal + 161 
11 UIKit        0x00000001026d5550 UIApplicationMain + 1282 
12 ViewDemo       0x0000000101a53657 main + 103 
13 libdyld.dylib      0x0000000104861145 start + 1 

) 的libC++ abi.dylib:與未捕獲終止異常類型NSException

這是從my demo複製的日誌。 它看起來像addObserver行動打破了superview和子視圖的關係。當superview dealloc時,子視圖不會先釋放。

有沒有人對此有興趣?

+0

你應該從''dealloc'方法中的RedView中刪除觀察者。 – arturdev 2014-09-28 08:12:18

+0

有類似的問題,嘗試在添加和刪除觀察者時記錄對象哈希值。你可以添加一個觀察者兩次,只刪除一次(甚至可能不能刪除兩次) – NikkyD 2014-10-02 14:39:49

+0

你在哪裏添加/刪除觀察者? (即在代碼中的位置)。 – 2016-01-06 17:42:31

回答

4

這個異常通常會在您銷燬一個先前添加了觀察者的對象時拋出。

要解決該問題,您需要在調用銷燬該對象的方法之前調用該相同對象上的removeObserver:forKeyPath:

+0

我有同樣的問題,我做刪除觀察員,但它似乎操作系統不會刪除它,如果我從來沒有添加它,這個問題消失 – NikkyD 2014-10-02 13:59:26

+0

不知道這一點,特別是沒有任何代碼看,但我會給它試圖從NSNotificationCenter – believesInSanta 2014-10-02 21:15:51

+0

PLZ使用removeObserver:方法看到我對原始問題的評論。不知何故,我的觀察員註冊了兩次,但第一次在迷失的地方迷失了方向,從未放鬆自己 – NikkyD 2014-10-02 23:06:20