好东西小知识点

Objective-C 中的消息机制笔记

2017-06-13  本文已影响100人  一铭_

这是一篇复习的笔记,梳理自己的知识点,加深理解.

[TOC]

Objective-C 中的消息机制

在OC中,方法的真正实现是在运行时绑定的,这是于 Swift 最大的不同, Swift 是在编译时.编译器会将消息的发送转换为对 objc_msgSend方法的调用.

OBJC_EXPORT void objc_msgSend(void /* id self, SEL op, ... */ )
OBJC_EXPORT void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ )

objc_msgSend 方法有两个必要的参数: receiver和 Selector,并且这个函数可以接受多个参数. objc_msgSend 会根据receiver 和 Sel的类型来调用适当的方法,所以,该方法会在 receiver 的调度表(dispatch table) 中查找 Sel.

编译器构造类时都包含两个必要元素:

  • 一个指向父类的指针;
  • 一个调度表,该表将类的 selector 方法与实际内存地址关联起来.

那一个类中有什么? 在 objc.h 中可以看到 Class 其实就是一个 objc_class 结构体指针,它的定义在 runtime.h 中:

struct objc_class {
    Class isa;
#if !__OBJC2__
    Class super_class                                        
    const char *name                                    
    long version                                           
    long info                                             
    long instance_size                                       
    struct objc_ivar_list *ivars                             
    struct objc_method_list **methodLists                    
    struct objc_cache *cache                             
    struct objc_protocol_list *protocols                    
#endif
}
上一篇下一篇

猜你喜欢

热点阅读