2013-04-18 251 views
1

reference我看到註冊一個觀察者通知是可能的一個null觀察者指針。但是,兩個remove方法都需要一個非空的有效指針值。在沒有註冊的情況下如何克服這一點?CFNotificationCenterRemoveObserver觀察者

我也注意到在這個答案的例子CFNotificationCenter usage examples?刪除是用NULL完成的,但是再次根據引用 - 這是錯誤的。

那麼,刪除NULL觀察者註冊的正確方法是什麼? 他們不應該被刪除(他們只是留在那裏,直到由於應用程序退出清除內存??)?

任何解釋都非常感謝!

回答

2

發送觀察者(這是一個void *,而不是由系統根本解釋)沒有真正的懲罰。首選的用例是,如果要刪除觀察者,則應將observer發送給初始CFNotificationCenterAddObserver調用和後續CFNotificationCenterRemoveObserver

舉例來說,向Add和Remove傳遞NULL實際上可行,但是當你指出它打破了API合約,因此我不會建議在發貨代碼中使用它。

observer本身通常只是一個字符串指針,只要你傳入相同的指針,你應該沒問題。

char *myObserver="anObserver"; 

CFNotificationCenterAddObserver (notificationCenter, (void*)myObserver, myCallback, NULL, NULL, CFNotificationSuspensionBehaviorDrop); 

及更高版本:

CFNotificationCenterRemoveObserver (notificationCenter, (void*)myObserver, NULL, NULL); 

確保您使用相同字符串的指針,而不是相同的字符串,如基金會只檢查了void*的平等,因此它不知道內容。

通過進一步的解釋,該模式的原因是,您可以使用單個回調來處理多個觀察者。

+0

感謝您的回答。但是,我仍然無法理解設置無法移除的空觀察者背後的邏輯。我有另一個開發人員編寫的註冊空觀察員的代碼。我無法添加指定的一個,現在沒有通知被刪除的地方,因爲這... – NightRider

+0

我不知道這裏很難理解什麼。註冊一個NULL觀察者基本上使它不能刪除它,直到應用程序退出。儘管接受NULL,但並不建議。 「我無法添加指定的」是什麼意思? – gaige

+0

我完全理解它,除了蘋果的邏輯背後。而且由於無法添加指定的代碼,我的意思是代碼中的一部分我無法更改。正如你所說 - 通知留在那裏,直到應用程序退出。再次感謝,我會接受你的回答:) – NightRider