gpt4 book ai didi

ios - NSNotification 面向对象

转载 作者:行者123 更新时间:2023-12-01 17:42:11 25 4
gpt4 key购买 nike

我正在阅读 iOS Big Nerd Ranch 书,其中一个示例显示了如何将观察者添加到 NSNotificaionCenter :

    [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:[UIDevice currentDevice]];

现在在orientationChanged中,方向是从NSNotification中发布的对象中检索的:
- (void)orientationChanged:(NSNotification *)note {
NSLog(@"orientationChanged %d", [[note object] orientation]);
}

我的困惑在于这一行: [[注意对象]方向]

NSNotification 的 对象 返回和 编号 ,所以这意味着我们在编译时不知道对象的类型是 UIDevice。但是我们可以访问 方向 从编译器返回的没有错误的对象。编译器如何知道对象类型是 UIDevice 并且访问方向是可以接受的?

最佳答案

How does the compiler know the object type is UIDevice?



它没有。

它看到它是 id .类型 id是通用对象类型。因此,如果您发送 ,编译器会毫无错误地接受它。任意 信息。即使你发送一个不存在的。

这是因为 Objective-C 是一种动态语言。方法调用(消息发送)、绑定(bind),甚至类型都是在运行时由 Objective-C 运行时库推断的。如果您向对象发送它未实现的消息(“响应”),则将引发运行时异常,而不是编译器错误。

顺便说一下,给 id 发消息假定返回 id (因此最多可以安全地返回指针大小的值,例如大多数整数),或者编译器查看所有类上的所有可用选择器名称并尝试将类型与它找到的选择器之一匹配,以防它确实是成立。

关于ios - NSNotification 面向对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15528178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com