Objective-C 如何提供“动态”运行时?这里的“动态”指的是什么?
问问题
6036 次
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 回答