到目前爲止,我一直在使用NSNotificationCenter的方法postNotification:aString object:anyObjectOfInterestForTheReceiver
。但最近我在文檔中看到object
字段只能通過self
。有沒有什麼可怕的副作用,我不知道應該說服我將來只通過self
,還是可以通過任何對象? 謝謝!NSNotification:對象屬性必須是自我嗎?
回答
您可以傳遞任何對象作爲通知的object
,但慣例是object
是「正在進行通知的事物」(並且您在userInfo
字典中放置了其他相關狀態)。
之所以主要是因爲self
是因爲通常進行通知的對象通常都想引用自己。這樣一來,例如,如果您有很多Foo
對象,並且其中一個完成了任務併發送了通知,則任何觀察該通知的人都可以查看object
以查看哪個Foo
是有問題的。遵循此方案時,觀察員也可以選擇僅觀察來自特定Foo
的通知。
在發佈通知時使用除「自我」之外的東西也是合理的(雖然不太常見) - 假設您正在「代表」另一個對象發送通知。例如,您可能是一個單身控制器對象,可以完成Bar
任務,並且您可以發送該通知時引用特定的Bar
作爲對象。這比使用單身作爲object
更有意義,因爲那裏沒有有趣的變化。
同樣,這只是一個(有用的)約定。當你編寫自己的通知時,你可以定義通知的「合同」,即名稱,使用什麼樣的對象作爲object
,以及userInfo
中的內容。
如果事件真的有發件人,這是至關重要的。
註冊觀察者時,可以指定要觀察的發件人。如果您讓其他人使用您的郵件,那麼正確傳遞發件人至關重要,否則綁定到特定發件人的觀察者將無法收到您的郵件。
是的,有一個我能想到的副作用。讓我解釋一下。
您談談NSNotification.h實際上是定義如下的方法:notificationSender
第一個參數(ID):
- (無效)postNotificationName:(的NSString *)notificationName對象notificationName代表通知的名稱。 第二個參數notificationSender代表發佈通知的對象。
是的,任何對象都可以是通知發送者,甚至可以是。
在observering通知的條款(以成爲特定通知的觀察者),我們才知道在NSNotification定義的另一個方法:notificationObserver選擇器(ID):
- (無效)的addObserver(SEL )notificationSelector名稱:(NSString *)notificationName對象:(id)notificationSender
正如您所見,最後一個參數是notificationSender(觀察者希望接收其通知的對象)。
所以現在,副作用顯然是。讓我詳細解釋一下。例如有三個控制器A,B,C。控制器A發佈通知helloEveryone。控制器B還發布通知helloEveryone。
在C控制器,如果你把象下面這樣的語句:[[[NSNotificationCenter defaultCenter]的addObserver:自我選擇:@selector(helloEveryOne)名稱:@ 「helloEveryone」 對象:無]
然後你將收到來自控制器A和B. 2個helloEveryone如果你把這樣的語句:
[[[NSNotificationCenter defaultCenter]的addObserver:自我選擇:@selector(helloEveryOne)名稱:@ 「helloEveryone」 對象:controllerA]
然後你會收到來自控制器A.只有一個helloEveryone
的自肯定不是零通知發送者,只要它可以發佈一個通知,但使用另一個對象作爲通知發送者,可能是它是一個零對象。觀察者的行爲在通知發送者是否爲零方面是不同的。
- 1. 我必須使用「這個」。在NodeJs中使用「對象」屬性?
- 2. 我是否必須配置SQLiteCommand對象?
- 3. 錯誤:帶'retain'屬性的'myBoolVariableName'屬性必須是對象類型
- 4. .Net SvcUtil:屬性必須是可選的
- 5. 是否必須使用flags屬性?
- 6. 左側必須是變量或屬性
- 7. 當實現INotifyPropertyChanged的嵌套屬性必須改變父對象傳播嗎?
- 8. 錯誤設置keen.timestamp,屬性敏銳的值必須是一個對象,是newtonsoft.json.linq.jproperty
- 9. 我必須手動釋放聲明爲保留的屬性嗎?
- 10. 我必須在-dealloc中釋放瞬態屬性嗎?
- 11. 我必須在DbContext上創建顯式的DbSet屬性嗎?
- 12. 何時必須將XPath屬性設置爲XML DOM對象?
- 13. 使用FluentNhibernate時,Entity中的屬性必須是虛擬的嗎?
- 14. 屬性值必須在@Retryable
- 15. 我必須清理window.onunload事件上的自定義屬性(Expandos)嗎?
- 16. 代理對象失敗的設置屬性,必須得到實際的對象
- 17. C#自動屬性 - 爲什麼我必須寫「get; set;」?
- 18. 的jsp:屬性必須是標準的或自定義操作
- 19. 架構:我必須提供對象屬性,每隔幾秒更新一次
- 20. 必須是變體或對象
- 21. 操作必須是純JavaScript對象
- 22. Struct.Error,必須是字節對象?
- 23. 我必須在這裏釋放對象嗎?
- 24. SingleTone,必須重置對象的屬性,如果它是一個新的
- 25. 目標屬性必須是依賴屬性 - 爲什麼?
- 26. 我是否必須處理我不使用的返回對象?
- 27. 我必須使用BreezeController嗎?
- 28. 我必須做StringIO.close()嗎?
- 29. 我必須致電sendResponse嗎?
- 30. 我必須這樣做嗎?