Objective-c如何在运行时处理方法解析?

时间:2013-01-08 16:41:48

标签: objective-c ios cocoa objective-c-runtime

我最近在这里读到,一个objective-c对象作为结构存储在堆上。该结构包含对象iVars,继承的iVars和isa指针。

我正在试图找出何时向此对象发送消息,运行时如何计算出要运行的代码?

我知道每个类都有一个类对象。这也存储在堆上吗?

我认为它的工作方式是运行时从结构中获取isa指针,使用它来调用类对象上的消息。它是否正确?

1 个答案:

答案 0 :(得分:11)

简而言之,每个Objective-C实例都有一个指向其类的指针。该类包含元数据清单,其中包括该类实现的所有方法。当消息发送到对象时 - 当调用方法时 - 运行时使用指向类的指针按名称查找方法并调用它(如果可以找到)。如果找不到,运行时会在NSObject的继承链上查找超类(它是每个类的元数据的一部分)。如果最终找不到该方法,那么运行时会经历一系列最后的努力,看看它们是否是一个替代处理程序并最终引发异常,如果没有。

如果你想要更多细节,我写了一个multipart tour of exactly how Objective-C method dispatch works.它稍微过时 - 不处理ARC,标记指针或块作为IMP - 但仍然完全适用。


是的,类存储在堆中,但通常不在malloc()d内存中。类通常作为只读,共享,内存加载。也就是说,在系统上运行的所有应用程序中,内存中只有NSString类的一个副本。你可以动态地动态创建类,这些类将在常规堆中,但它是非典型的。