Objective-C如何提供动态运行时?

时间:2012-11-09 10:22:19

标签: objective-c dynamic binding

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

2 个答案:

答案 0 :(得分:20)

在一句话中:Objective-C决定在执行此操作之前(在运行时期间)调用哪个实现方法。我们的想法是方法的 name 实现之间的连接是动态的。例如,C ++在编译期间执行此操作。

示例:

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

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

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

运行时决定调用哪个实现从字符串或NSNumber中提取int值。

答案 1 :(得分: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的描述方法,因此您只能看到大括号之间的对象地址: / p>

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

在C ++中有静态绑定,非常讨厌我个人的观点.Java和Objective-C是动态的。