在使用 NSNotificationCenter时,需要注意的一个地方:往NSNotificationCenter加Observer的方式是追加式的,也就是说总是在原有的内容上再添加。举个例子来说,会清楚点,假设下面的调用被执行了两次,则当someObject2发出一条名称为@“NotificationName”的通知后,someObject1会先后得到两条这种通知,然后先后执行两次someMethod中的操作。
[[ NSNotificationCenter defaultCenter] addObserver:someObject1
selector:@selector(someMethod)
name:@“NotificationName”
object:someObject2];
附 官方文档对NSNotificationCenter的解说:
An NSNotificationCenter
object (or simply, notification center) provides a mechanism for broadcasting information within a program. AnNSNotificationCenter
object is essentially a notification dispatch table.
Objects register with a notification center to receive notifications (NSNotification
objects) using theaddObserver:selector:name:object:
or addObserverForName:object:queue:usingBlock:
methods. Each invocation of this method specifies a set of notifications. Therefore, objects may register as observers of different notification sets by calling these methods several times.
When an object (known as the notification sender) posts a notification, it sends an NSNotification
object to the notification center. The notification center then notifies any observers for which the notification meets the criteria specified on registration by sending them the specified notification message, passing the notification as the sole argument.
A notification center maintains a notification dispatch table which specifies a notification set for a particular observer. A notification set is a subset of the notifications posted to the notification center. Each table entry contains three items:
-
Notification observer: Required. The object to be notified when qualifying notifications are posted to the notification center.
-
Notification name: Optional. Specifying a name reduces the set of notifications the entry specifies to those that have this name.
-
Notification sender: Optional. Specifying a sender reduces the set of notifications the entry specifies to those sent by this object.
Table 1 shows the four types of dispatch table entries and the notification sets they specify. (This table omits the always present notification observer.)
Notification name | Notification sender | Notification set specified |
---|---|---|
Specified | Specified | Notifications with a particular name from a specific sender. |
Specified | Unspecified | Notifications with a particular name by any sender. |
Unspecified | Specified | Notifications posted by a specific sender. |
Unspecified | Unspecified | All notifications. |
Table 2 shows an example dispatch table with four observers.
Observer | Notification name | Notification sender |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
When notifications are posted to the notification center, each of the observers in Table 2 are notified of the following notifications:
-
observerA
: Notifications namedNSFileHandleReadCompletionNotification
. -
observerB
: Notifications sent byaddressTableView
. -
observerC
: Notifications namedNSWindowDidChangeScreenNotification
sent bydocumentWindow
and notifications sent byaddressTableView
. -
observerD
: All notifications.
The order in which observers receive notifications is undefined. It is possible for the posting object and the observing object to be the same.
A notification center delivers notifications to observers synchronously. In other words, the postNotification:
methods do not return until all observers have received and processed the notification. To send notifications asynchronously use NSNotificationQueue
. In a multithreaded application, notifications are always delivered in the thread in which the notification was posted, which may not be the same thread in which an observer registered itself.
Important: The notification center does not retain its observers, therefore, you must ensure that you unregister observers (usingremoveObserver:
or removeObserver:name:object:
) before they are deallocated. (If you don't, you will generate a runtime error if the center sends a message to a freed object.)
Each running Cocoa program has a default notification center. You typically don’t create your own. An NSNotificationCenter
object can deliver notifications only within a single program. If you want to post a notification to other processes or receive notifications from other processes, use a NSDistributedNotificationCenter
object.