这个 Objective-C 代码是如何工作的?

How does this Objective-C code work?

代码:

int main(int argc, const char * argv[]) {
    id idObject = @"12345";
    NSNumber *n = idObject;

    NSLog(@"%@\n", [n description]);
    return 0;
}

它打印“12345”。如何?我猜这是因为 Objective-C 使用了动态绑定。因此,选择哪个方法的决定是在运行时做出的,这个决定是基于方法的名称(选择器)和接收者对象。也许接收器对象由于 "isa" 指针而被知道... ?

之所以有效,是因为:

  1. 所有从 NSObject 继承的对象都有一个 description 方法。
  2. Objective-C 不强制类型,所以 n 实际上是一个 NSString 而不是你想象的 NSNumber

要添加:

您实际上并不是通过将 idObject 设置为由 NSNumber * n 引用来进行类型转换。编译器不知道 id 应该是什么类型,所以它允许您将它分配给任何东西。

通过您的代码片段 运行,您可以进一步了解这是如何进行的:

然后进行比较(从字符串文字创建一个 NSNumber):

你是对的。

代码有效,因为 n 引用了一个理解消息 description 的对象。 (该对象是 class NSString 的实例对象,这些对象理解该消息。)

对象引用的类型nidNSString*NSNumber*whatever)对调度过程没有任何意义。

在运行时,您可以收集有关对象及其类型的许多信息。您无法收集有关对象引用的信息。 (有一个案例,但这并不重要。)