Objective-C如何提供“动态”运行时? “动态”在这里指的是什么?
答案 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是动态的。