2013-01-16 73 views
0

我期待通過TestFlight和最頻繁的崩潰我的崩潰報告是:我的觀察員爲何未註冊?

,因爲它未註冊無法刪除觀察員「ListViewController 0x1d590500」從「ListArchiver 0x1d5b83b0」關鍵路徑「batchImageDownloadingInProgress」作爲觀察員。

ListViewController

- (void)viewWillAppear:(BOOL)animated 
{ 
    ... 

    [[WanderlistArchiver sharedArchiver] addObserver:self forKeyPath:@"batchImageDownloadingInProgress" options:NSKeyValueObservingOptionNew context:nil]; 
} 

// **** the error happens in here **** 
- (void)viewWillDisappear:(BOOL)animated 
{ 
    ... 

    [[WanderlistArchiver sharedArchiver] removeObserver:self forKeyPath:@"batchImageDownloadingInProgress"]; 
} 

如果我成立了觀察員viewWillAppear(不要在代碼中觸摸它在其他地方),它爲什麼仍然註冊時viewWillDisappear運行?這在過去的90天裏只發生過5次,但我仍然想明白爲什麼會發生這種情況。

+0

一定要調用'[super viewWillAppear:animated]'和'[super viewWillDisappear:animated]'。我不認爲這是你的問題,但可能會導致意想不到的結果。 –

+0

是的,我確實這樣做了,但是讓它更加專注。 – djibouti33

+0

您的sharedArchiver單身人士如何處理?有沒有可能在不同於addObserver的實例上調用removeObserver? – Taum

回答

1

最可能的問題是viewWillDisappear:被稱爲不止一次呼叫viewWillAppear:。由於這似乎很少發生,因此必定會有一些奇怪的事件序列導致這種情況發生。

一種可能的解決方法是,如果無法重現問題,則添加一個BOOL伊娃。添加觀察者時,在viewWillAppear:中將其設置爲YES。在viewDidAppear:,檢查它是否設置。如果設置,則將其設置爲NO並移除觀察者。如果沒有設置,那麼你知道不要刪除觀察者。

1

你應該確保context是一樣的。在你的remove語句中,你正在使用不使用上下文的方法。使用上下文變量而不是nil,並確保它在添加和刪除語句中是相同的。

查看this question瞭解更多詳細說明。

+0

感謝您的鏈接和建議。這個答案假定某個班級正在觀察它的屬性。我有一個對象觀察另一個對象的屬性。看起來像在ListArchiver#setBatchImageDownloadInProgress中設置觀察會困難得多。 1)我不知道ListViewController的確切實例,2)跨兩個對象共享相同的上下文(靜態地址)會很複雜。也許我錯過了一些東西;想法? – djibouti33

+0

我認爲你可以讓每個觀察對象都有自己的上下文,這會使這個微不足道。 – Mundi

相關問題