類擴張和分類的區(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文件






