我很难理解Objective C中动态绑定Vs动态类型之间的区别。有人可以解释一下吗?
答案 0 :(得分:33)
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]
例如,如果foo
是NSArray
的实例而不是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;基于在运行时调用的对象类型调用正确方法的行为。
我希望有帮助