NSNotification 'object' 和 'userInfo' 有啥区别?

Posted

技术标签:

【中文标题】NSNotification \'object\' 和 \'userInfo\' 有啥区别?【英文标题】:What's Difference between NSNotification 'object' and 'userInfo'?NSNotification 'object' 和 'userInfo' 有什么区别? 【发布时间】:2015-02-16 10:02:28 【问题描述】:

NSNotificationobjectuserInfo有什么区别?

当我发布带有参数的通知时,我可以使用objectuserInfos 来执行此操作。但是我不知道这两种方式有什么区别。

使用userInfo 有什么好处吗?还是使用object 就够了?

【问题讨论】:

如果您查看NSNotificationuserInfos 的文档,您会发现object 是通知发送者,userInfos 包含其他信息。 object 也可以包含其他信息。有区别吗? 【参考方案1】:

object 表示发布通知的对象。 userInfo 包含接收对象/函数的附加信息/数据。

根据NSNotificationCenter Class Reference:

postNotificationName:object:userInfo:

创建具有给定名称、发件人和信息的通知,并 将其发布给接收者。

声明

斯威夫特

func postNotificationName(_ notificationName: String, object notificationSender: AnyObject?, userInfo userInfo: [NSObject : AnyObject]?)

Objective-C

- (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender userInfo:(NSDictionary *)userInfo

参数

notificationName

通知的名称。

notificationSender

发布通知的对象。

userInfo

关于通知的信息。可能为零。

讨论

此方法是发布通知的首选方法。

【讨论】:

谢谢,但我想知道如果我使用object 发送附加信息会有什么“危险”?【参考方案2】:

如果您定义一个对象,您可以过滤仅由该对象发送的通知。例如,如果您注册通知,将对象指定为 notificationSender,即使通知名称与其他已发布通知的名称相同,您也只能从该对象获得通知:

- (void)addObserver:(id)notificationObserver
       selector:(SEL)notificationSelector
           name:(NSString *)notificationName
         object:(id)notificationSender

这是来自 Apple 文档:

notificationSender 观察者想要其通知的对象 接受;也就是说,只有这个发件人发送的通知是 传递给观察者。

如果你传递 nil,通知中心不使用通知的 sender 决定是否将其交付给观察者。

【讨论】:

【参考方案3】:

使用 NSNotification 对象时,您需要熟悉 userInfo 字典,它提供对接收者可能感兴趣的任何其他对象的访问。如果您在多个对象上使用相同的通知,了解对象方法也可能会有所帮助。

更多详情请点击此链接。

http://iosdevelopertips.com/cocoa/nsnotification-userinfo-and-object-methods.html

【讨论】:

以上是关于NSNotification 'object' 和 'userInfo' 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

NSNotification消息

NSNotification 或 Delegate 在可见视图更改时注册

Notification通知代码简洁使用

NSNotification、addObserver 和 removeObserver - ViewDidUnload 和 dealloc 中的 removeObserver?

NSNotification/绑定?

NSNotification 和关闭模式视图控制器的问题