Category
的實現原理?
被添加在了
class_rw_t
的對應結構裏。
Category
實際上是 Category_t
的結構體,在運行時,新添加的方法,都被以倒序插入到原有方法列表的最前面,所以不同的Category
,添加了同一個方法,執行的實際上是最後一個。
拿方法列表舉例,實際上是一個二維的數組。
Category
如果翻看源碼的話就會知道實際上是一個 _catrgory_t
的結構體。
--
例如我們在程序中寫了一個 Nsobject+Tools
的分類,那麼被編譯爲 C++
之後,實際上是:
static struct _catrgory_t _OBJC_$_CATEGORY_NSObject_$_Tools __attribute__ ((used,section),("__DATA,__objc__const"))
{
// name
// class
// instance method list
// class method list
// protocol list
// properties
}
Category
在剛剛編譯完的時候,和原來的類是分開的,只有在程序運行起來後,通過 Runtime
,Category
和原來的類纔會合併到一起。
mememove
,memcpy
:這倆方法是位移、複製,簡單理解就是原有的方法移動到最後,根根新開闢的控件,把前面的位置留給分類,然後分類中的方法,按照倒序依次插入,可以得出的結論就就是,越晚參與編譯的分類,裏面的方法纔是生效的那個。
面試題持續整理更新中,需要拿到第一手大廠面試題及答案文檔可以添加 iOS進階學習交流羣:551346706 !結實人脈、討論技術你想要的這裏都有!