NSNotification:对象属性必须是self吗?

3

到目前为止,我一直使用NSNotificationCenter的方法postNotification:aString object:anyObjectOfInterestForTheReceiver。但最近我在文档中读到,object字段应该只传递self。是否有任何可怕的副作用我不知道,这应该让我在将来只传递self,或者传递任何对象都可以吗? 谢谢!

3个回答

7
您可以将任何对象作为通知的object传递,但是惯例是object是“正在发出通知的东西”(并且您可以将其他相关状态放入userInfo字典中)。
大多数情况下使用self是因为发出通知的对象通常想要引用自身。例如,如果您有许多Foo对象,并且其中一个对象完成任务并发送通知,则观察通知的任何人都可以查看object以查看哪个Foo是被问及的那个。遵循此方案时,观察者还可以选择仅观察来自特定Foo的通知。
在发布通知时使用除“self”以外的内容也是合理的(尽管较少见)-假设您代表另一个对象发送通知。例如,您可以是单例控制器对象,该对象完成了Bar任务,然后您可以将对特定Bar的引用作为对象发送通知。这比使用单例作为object更有意义,因为在那里没有任何有趣的变化。
再次强调,这只是一种(有用的)约定。当您自己创建通知时,您可以定义通知的“合同”,即名称,用作object的对象类型以及userInfo中包含什么。

2
是的,我想到了一个副作用,请让我解释一下。
你所讲的方法实际上在NSNotification.h中定义如下:
(void)postNotificationName:(NSString *)notificationName object:(id)notificationSender 第一个参数notificationName代表通知的名称。 第二个参数notificationSender代表发送通知的对象。
是的,任何对象都可以成为通知发送者,甚至nil也可以。
在观察通知方面(成为特定通知的观察者),我们需要了解NSNotification中定义的另一个方法:
(void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender 正如您所看到的,最后一个参数是notificationSender(观察者想要接收其通知的对象)。
现在,显然存在一个副作用。让我详细说明一下。比如有三个控制器A、B、C。控制器A发布一个名为helloEveryone的通知。控制器B也发布一个名为helloEveryone的通知。 在C控制器中,如果您放置以下语句:
[[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(helloEveryOne) name:@"helloEveryone" object:nil]
那么您将从控制器A和控制器B收到两个helloEveryone。 如果您放置以下语句:
[[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(helloEveryOne) name:@"helloEveryone" object:controllerA]
那么您将只从控制器A收到一个helloEveryone。
self肯定不是一个空的通知发送者,只要它可以发布通知,但使用另一个对象作为通知发送者可能是一个nil对象。观察者的行为取决于通知发送者是否为nil。

1

如果事件确实有发送者,则非常关键。

当您注册观察器时,可以指定要观察的发送者。如果您让其他人使用您的消息,因此正确传递发送者非常重要,否则绑定到特定发送者的观察器将无法接收您的消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接