Fraction* myFraction=[Fraction new];
[myFraction method];
myFraction
是一个指针,它分配有内存地址。使用myFraction
的方法时,是否应该使用* myFraction
?
答案 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