如何理解Objective-C中的指针

时间:2017-12-30 10:16:33

标签: objective-c pointers

Fraction* myFraction=[Fraction new];
[myFraction method];

myFraction是一个指针,它分配有内存地址。使用myFraction的方法时,是否应该使用* myFraction

1 个答案:

答案 0 :(得分:3)

你在考虑C.相反,Objective-C实际上是动态调度的,这意味着你实际上并没有在Objective-C对象上调用函数。相反,您“向实例发送消息”。 Objective-C运行时处理该消息的实际转换为C函数调用。

在您的示例中,[myFraction method]实际上编译为与objc_msgSend(myFraction, @selector(method))类似的内容。

objc_msgSend()函数是Objective-C的核心。每个支持的平台都是手written in assembly。在此程序集调用中,运行时将确定实例的类型 - 在这种情况下为Fraction - 并搜索Fraction Class上的已知实例方法。如果没有找到方法,它将搜索Fraction的超类一直到根(NSObject)。

确定-[Fraction method]的相应C函数后,objc_msgSend将为您调用它。

有趣的是,生成的C函数调用实际上提供了两个额外的参数(myFraction指针和原始方法选择器)。在执行您在self中编写的代码之前,这些内容会被删除并存储在_cmd-[Fraction method]中。这是实例状态传递给实例函数的方式!非常酷:))

一些阅读:

https://www.mikeash.com/pyblog/friday-qa-2012-11-16-lets-build-objc_msgsend.html