14

Objective-C 如何提供“动态”运行时?这里的“动态”指的是什么?

4

2 回答 2

22

一句话:Objective-C在调用之前(在运行时)决定调用哪个方法实现。这个想法是方法名称实现之间的连接是动态的。例如,C++ 在编译时解析名称。

例子:

id object = @"1";
int i = [object intValue];

object = @1;
i = [object intValue];

在此示例中,intValue消息首先发送到 的实例,NSString然后发送到NSNumber. 对于这两个调用,编译器发出的代码是相同的——事实上,编译器甚至不知道它向哪种对象发送消息(因为类型是id)。

运行时决定调用哪个实现来从字符串或NSNumber.

于 2012-11-09T10:25:52.233 回答
1

动态术语是指与虚拟表的绑定。也称为后期绑定,如果绑定发生在编译时,那么接收消息的真实对象是什么并不重要,重要的是对该对象的引用类型.使用后期绑定,重要的是对象(我个人更喜欢后期绑定),所以当你重写一个方法时,如果对象属于那个类,它会被调用。考虑这个类:

@interface Person : NSObject

@end


#import "Person.h"

@implementation Person

- (NSString*) description
{
    return @"A good person, smart but lazy";
}

@end

如果您尝试记录描述:

NSObject* obj=[[Person alloc]init];
NSLog(@"%@",obj); // same as NSLog(@"%@",[obj description]);

这会记录“一个好人,聪明但懒惰”。如果与虚拟表的绑定是静态的,则使用超类 NSObject 的描述方法,因此您只会看到大括号之间的对象地址:

<Person: 0x1001083b0>   // Address of the object

在 C++ 中有静态绑定,我个人认为这很烦人。Java 和 Objective-C 是动态的。

于 2012-11-09T10:39:27.530 回答