當前位置:編程學習大全網 - 源碼下載 - OC 類的結構分析

OC 類的結構分析

我們OC類在編譯後會變成壹個objc_class的結構體

objc_class裏面包含superclass、cache、bits三部分 其實還與壹個隱藏的屬性isa(繼承objc_object得到)

objc_class結構體繼承了objc_object結構體

用壹幅圖來表示 類的結構大致如下

類其實也是壹種對象 我們稱之為類對象 類對象的類是元類 這裏的isa指向的就是元類

顧名思義就是當前類的父類

這裏緩存的是已經調用過的方法 方便再次調用時能快速查找

bits調用data()函數 會返回壹個class_rw_t的結構體數據

class_rw_t中存放有方法列表、屬性列表、協議列表 同時也還有壹個class_ro_t

class_ro_t中數據也有方法列表、屬性列表、協議列表 但是還多了壹個成員變量列表

class_ro_t中是類的本身的原始數據 在編譯時就確定了 class_rw_t是運行時生成的 在類的加載過程中class_rw_t初始化並拷貝了class_ro_t中方法列表、屬性列表、協議列表等 同時把class_ro_t也保存自己裏邊 註意 這裏並沒有將成員變量列表(ivar_list_t)拷貝過去 那麽為什麽要用到這個class_rw_t呢 這裏我們有必要介紹壹下 分類

分類編譯後也同樣是壹個結構體 如下圖 裏邊同樣也有方法列表、協議列表、和屬性列表 但是區分了對象方法和類方法列表 類中為什麽沒有區分呢 因為 類中只有對象方法 類方法是類對象的方法 在元類中

在加載分類過程中 會將分類中的方法列表、協議列表、屬性列表等插入到相應的class_rw_t中 這裏需要註意壹點 分類中的方法是向前插入的 也就是說在方法列表中分類的方法會在主類上邊

現在想壹個問題 我們的方法調用到底查詢的哪個方法列表呢 沒錯 就是class_rw_t裏面的方法列表 它既包含了主類的又包含了分類的 這也就是解釋了上面的問題 為什麽用到class_rw_t

1.分類能不能直接使用屬性 為什麽?

答案:不能 直接使用會產生崩潰 因為找不到setter或getter方法 屬性是會默認生成壹個成員變量和setter、getter方法 在分類中可以添加屬性 但是不會生成成員變量和setter、getter方法 因為成員變量是存放在class_ro_t中的 分類中不能添加成員變量 如果想使用可以通過關聯對象的方式自己實現setter和getter方法

2.分類中有和主類相同的方法 實際哪個會調用?

答案:分類會調用 因為分類中的方法插入class_rw_t中是向前插入 class_rw_t的方法列表中分類方法在前 主類在後

  • 上一篇:什麽是比特幣 以及它的優缺點
  • 下一篇:求:商品期貨日內交易技巧。賞分!!!
  • copyright 2024編程學習大全網