这个 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" 指针而被知道... ?
之所以有效,是因为:
- 所有从
NSObject
继承的对象都有一个 description
方法。
- Objective-C 不强制类型,所以
n
实际上是一个 NSString
而不是你想象的 NSNumber
。
要添加:
您实际上并不是通过将 idObject
设置为由 NSNumber * n
引用来进行类型转换。编译器不知道 id
应该是什么类型,所以它允许您将它分配给任何东西。
通过您的代码片段 运行,您可以进一步了解这是如何进行的:
然后进行比较(从字符串文字创建一个 NSNumber):
你是对的。
代码有效,因为 n
引用了一个理解消息 description
的对象。 (该对象是 class NSString
的实例对象,这些对象理解该消息。)
对象引用的类型n
(id
、NSString*
、NSNumber*
、whatever
)对调度过程没有任何意义。
在运行时,您可以收集有关对象及其类型的许多信息。您无法收集有关对象引用的信息。 (有一个案例,但这并不重要。)
代码:
int main(int argc, const char * argv[]) {
id idObject = @"12345";
NSNumber *n = idObject;
NSLog(@"%@\n", [n description]);
return 0;
}
它打印“12345”。如何?我猜这是因为 Objective-C 使用了动态绑定。因此,选择哪个方法的决定是在运行时做出的,这个决定是基于方法的名称(选择器)和接收者对象。也许接收器对象由于 "isa" 指针而被知道... ?
之所以有效,是因为:
- 所有从
NSObject
继承的对象都有一个description
方法。 - Objective-C 不强制类型,所以
n
实际上是一个NSString
而不是你想象的NSNumber
。
要添加:
您实际上并不是通过将 idObject
设置为由 NSNumber * n
引用来进行类型转换。编译器不知道 id
应该是什么类型,所以它允许您将它分配给任何东西。
通过您的代码片段 运行,您可以进一步了解这是如何进行的:
然后进行比较(从字符串文字创建一个 NSNumber):
你是对的。
代码有效,因为 n
引用了一个理解消息 description
的对象。 (该对象是 class NSString
的实例对象,这些对象理解该消息。)
对象引用的类型n
(id
、NSString*
、NSNumber*
、whatever
)对调度过程没有任何意义。
在运行时,您可以收集有关对象及其类型的许多信息。您无法收集有关对象引用的信息。 (有一个案例,但这并不重要。)