發送觀察者(這是一個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*
的平等,因此它不知道內容。
通過進一步的解釋,該模式的原因是,您可以使用單個回調來處理多個觀察者。
感謝您的回答。但是,我仍然無法理解設置無法移除的空觀察者背後的邏輯。我有另一個開發人員編寫的註冊空觀察員的代碼。我無法添加指定的一個,現在沒有通知被刪除的地方,因爲這... – NightRider
我不知道這裏很難理解什麼。註冊一個NULL觀察者基本上使它不能刪除它,直到應用程序退出。儘管接受NULL,但並不建議。 「我無法添加指定的」是什麼意思? – gaige
我完全理解它,除了蘋果的邏輯背後。而且由於無法添加指定的代碼,我的意思是代碼中的一部分我無法更改。正如你所說 - 通知留在那裏,直到應用程序退出。再次感謝,我會接受你的回答:) – NightRider