Runtime相關

1. 相關數據結構

  • objc_object算法

    objc_object

  • objc_class緩存

    objc_class

    • cache_tbash

      • 用於快速查找方法執行函數
      • 是可增量擴展的哈希結構
      • 是局部性原理的最佳應用

      cache_t

    • class_data_bits_t數據結構

      • class_data_bits_t主要是對class_rw_t的封裝
      • class_rw_t表明類相關的讀寫信息、對class_ro_t的封裝
      • class_ro_t表明類相關的只讀信息
  • isa 指針函數

    isa

    • 實例對象,isa指向其類對象ui

    • 類對象,isa指向其元類對象spa

  • method_t 指針

    method_t

    • Type Encodingscode

      • const char* types;
  • 整體 cdn

2. 對象、類對象、元類對象

  • 類對象存儲實例方法列表等信息
  • 元類對象存儲類方法列表等信息
    經典圖

3. 消息傳遞

  • super

    void objc_msgSend(void /* id self, SEL op, ... */)
    
    // [self class] => objc_msgSend(self, @selector(class))
    複製代碼
    void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */)
    
     struct objc_super {
         /// Specifies an instance of a class 
         __unsafe_unretained id receiver;
     }; 
    
    // [super class] => objc_msgSendSuper(super, @selector(class))
    複製代碼

  • 緩存查找

    • 給定值是SEL,目標值是對應的bucket_t中的IMP

  • 當前類中查找

    • 已排序好的列表,採用二分查找算法查找方法對應執行函數
    • 沒有排序的列表,採用通常遍歷查找方法對應執行函數
  • 父類逐級查找

  • 消息轉發

4. Method-Swizzling

方法交換

5. 動態方法添加

+ (BOOL)resolveInstanceMethod:(SEL)sel {

    if (sel == @selector(test)) {
        // 動態添加test方法的實現
        class_addMethod(self, @selector(test), testImp, "v@:");
        return YES;
    } else {
        // 返回父類的默認調用
        return [super resolveInstanceMethod:sel];
    }
}

複製代碼

6. 動態方法解析

  • @dynamic

    • 動態運行時語言將函數決議推遲帶運行時
    • 編譯時語言在編譯期進行函數決議
相關文章
相關標籤/搜索