Objective C中动态绑定Vs动态类型有什么区别

时间:2012-02-20 16:46:55

标签: objective-c

我很难理解Objective C中动态绑定Vs动态类型之间的区别。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:33)

Objective-C中的

Dynamic typing表示类型为id的对象的类在编译时是未知的,而是在将消息发送到对象时在运行时发现的。例如,在以下代码中,在我们尝试发送消息foo之前,不知道componentsSeparatedByString:的类。

id foo = @"One Two Three";
NSArray *a = [foo componentsSeparatedByString:@" "];

如果我们没有使用id数据类型,而是执行了以下操作...

NSString *foo = @"One Two Three";

...然后我们将使用静态类型而不是动态类型。

Dynamic binding表示编译器不知道将选择哪个方法实现;而是在发送消息时在运行时查找方法实现。它基本上帮助我们Polymorphism。所以

[foo description]
例如,如果fooNSArray的实例而不是NSString的实例,则

会导致调用其他方法实现。

答案 1 :(得分:7)

使用动态类型,您可以拥有一个可以存储任何类型对象的id类型的变量。使用动态绑定,您可以执行此操作:id obj; [obj doWhatever];并且只要obj是实现-(void)doWhatever的类型,它就可以正常工作。

答案 2 :(得分:3)

来自Apple文档

动态类型

当在编译时未检查它指向的对象的类型时,动态地键入变量。 Objective-C使用id数据类型来表示作为对象的变量,而不指定它是什么类型的对象。这被称为动态类型。

动态类型与静态类型形成对比,其中系统在编译时显式标识对象所属的类。在编译时进行静态类型检查可以确保更严格的数据完整性,但为了换取这种完整性,动态类型为您的程序提供了更强大的 灵活性 。通过对象内省(例如,向动态类型的匿名对象询问其类是什么),您仍然可以在运行时验证对象的类型,从而验证其是否适合特定操作。

以下示例说明了使用异构对象集合的动态类型:

NSArray *anArray = [NSArray arrayWithObjects:@"A string", [NSDecimalNumber zero], [NSDate date], nil];
NSInteger index;
for (index = 0; index < 3; index++) {
    id anObject = [anArray objectAtIndex:index];
    NSLog(@"Object at index %d is %@", index, [anObject description]);
}

变量在运行时指向的对象必须能够响应您发送给它的任何消息;否则,您的程序会抛出异常。调用的方法的实际实现是使用动态绑定确定的。

动态绑定

动态绑定决定了在运行时而不是在编译时调用的方法。动态绑定也称为后期绑定。在Objective-C中,所有方法都在运行时动态解析。执行的确切代码由方法名称(选择器)和接收对象确定。

动态绑定可实现多态性。例如,考虑一系列对象,包括Dog,Athlete和ComputerSimulation。每个对象都有自己的run方法实现。在下面的代码片段中,表达式[anObject run]应该执行的实际代码是在运行时确定的。运行时系统使用方法运行的选择器来识别anObject类中的适当方法。

 NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil];
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)];
[anObject run];

答案 3 :(得分:0)

如果您熟悉Javascript,则在目标C中进行动态类型非常类似于&#39; var&#39;在Javascript中,此变量的实际类型将在运行时计算出来,并在分配之后计算出来。它可以根据您的喜好重复使用和重新输入,如果您不知道执行时所持对象的类型,则可能会使用它,因为它可能无法识别选择&#39;运行时异常。在Objective-C中,所有对象都是id类型,因此可以使用id类型的变量进行动态类型化。

对象的动态绑定是多态的&#39;基于在运行时调用的对象类型调用正确方法的行为。

我希望有帮助