iOS 類擴展

類擴張和分類的區(qū)別

1、category類別、分類

  • 專門用來給類添加新方法
  • 不能添加成員屬性,添加了也不能娶到
  • 可以通過runtime 給分類添加屬性,即使屬性關(guān)聯(lián),重寫setter、getter方法
  • 使用@property定義變量,只會生成setter、getter方法的聲明,不能生成方法的實現(xiàn)和下劃線成員變量

2、extension類擴展

  • 特殊分類(匿名分類)
  • 給類添加成員屬性(私有變量)
  • 給類添加方法(私有方法)

類擴展 的底層探索

有兩種創(chuàng)建類擴展的方式

  • 直接在類中書寫(在.m文件中,在聲明之后,實現(xiàn)之前)
  • 通過command+N新建 Objective-C File 選擇Extension
    類擴展的創(chuàng)建

類擴展的本質(zhì)

clang底層編譯

  • 創(chuàng)建一個類擴展


    創(chuàng)建類擴展
  • 通過clang -rewrite-objc main.m -o main.cpp命令生成cpp文件并打開,搜索ext_name屬性

    clang底層編譯

  • 查看LGTeacher類擴展的方法,在編譯過程中,方法就直接添加到methodlist中,作為類的一部分

    clang底層編譯

通過源碼調(diào)試探索

  • 創(chuàng)建類擴展 LGPerson+LGEXT.h,并聲明兩個方法,在LGPerson.m中實現(xiàn)這兩個方法

    源碼調(diào)試

  • 運行objc源碼程序,在readClass中下一個斷點,查看kc_ro

    源碼調(diào)試

  • 在控制臺中p kc_ro->baseMethodList --> p $0->get(0) ~ p $0->get(10)

    源碼調(diào)試

總結(jié)

  • 類擴展在編譯時期會作為類的一部分,和類一起編譯進來
  • 類擴展只是聲明,依賴于當前的主類,沒有.m文件,可以理解為一個.h文件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容