Objective C 分類底層原理分析

2021-09-29 19:03:29 字數 2269 閱讀 9330

ios分類使用的場景就是把功能模組化,把一組類似的功能擴充套件出乙個分類,便於**的維護以及功能的分塊

分類在ios底層的資料結構如下:

struct _category_t ;
name:被分類的類名稱

cls :isa指標

instance_methods:物件方法列表

class_methods:類方法列表

protocols:協議列表

properties:屬性列表

有上面的資料結構可以看出:

分類可以擴充套件乙個類的(物件方法,類方法,協議和屬性)。

name:被分類的類名稱

cls :isa指標

instance_methods:物件方法列表

class_methods:類方法列表

protocols:協議列表

properties:屬性列表

有上面的資料結構可以看出:

分類可以擴充套件乙個類的(物件方法,類方法,協議和屬性)但不能增加成員變數。同時,新增的屬性不會生成get和set方法的實現,如果需要,則要用執行時動態新增

其實我們寫的所有分類的資料結構都是跟上面一樣的,不同的是裡面存放的資料 

例如我建立乙個person+eat的分類

#import "person.h"

ns_assume_nonnull_begin

@inte***ce person (eat)

-(void)eat;

@end

ns_assume_nonnull_end

#import "person+eat.h"

@implementation person (eat)

-(void)eat

@end

struct _category_t ;
static struct _category_t _objc_$_category_person_$_eat __attribute__ ((used, section ("__data,__objc_const"))) = 

;

上面可以看出:這個分類的型別就是上面第二步說到的《  _category_t 》 型別,結構體的賦值如下:

name:"person"

cls : &objc_class_$_person

instance_methods:eat方法

class_methods:沒有,所以為空

protocols:沒有,所以為空

properties:沒有,所以為空

上面幾個步驟說到的只是分類的結構,是程式編譯的時候就已經生成的。 但這個分類跟對應的類關聯在一起是在執行時,這個就用到oc的runtime機制了,runtime在程式執行的過程中,會把所有的分類,合併到對應的類或者原類裡面去,如果有同名方法,會優先呼叫分類裡面的方法(利用這個功能,我們可以對系統的類做方法交換)

分類的實現的具體步驟:

所有分類的方法會存放在乙個二維陣列裡面,二維陣列的每乙個陣列就是其中乙個分類的所有方法,在執行時,會遍歷這個陣列,然後把所有的方法新增到對應的類裡面去,具體新增的步驟如下

1、根據要新增的方法陣列大小加上原來陣列的大小,重新分配陣列空間,

2、先把原來類的陣列的儲存位址向後面移動n個單元,n取決於二維陣列的大小,然後把新傳進來的陣列從大到小的順序進行遍歷,乙個乙個插入到新分配的陣列空間裡面去,因為從大到小的順序進行遍歷,也就是陣列後面的會排在第乙個。二維陣列的順序是編譯的先後順序決定的,所以同乙個方法名,後編譯的分類的方法比先編譯的方法優先執行

把分類裡面的方法合併到對應的類中的核心原始碼:

/**

* addedlists 所有分類的方法列表

* addedcount 有多少個分類

*/void attachlists(list* const * addedlists, uint32_t addedcount)

else if (!list && addedcount == 1)

else

}

類擴充套件是程式編譯的時候就確定了的,類擴充套件一般是擴充套件私有屬性和方法

ConcurrentHashMap底層原理

出自jdk5新引進的concurrent包,concurrenthashmap主要解決了兩個問題 相較於只使用synchronized的hashtable提高了效能,根據具體場景進行不同的設計,盡量避免了重量級鎖。不同於hashmap,採用了fail safe弱一致性迭代器,再迭代器使用過程中,可以...

objective c底層 runtime機制

runtime是oc的真面目。oc底層的一套c語言api.unsigned int count 獲取屬性列表 objc property t propertylist class copypropertylist self class count for unsigned int i 0 i 獲取方...

Objective C 協議 分類 擴充套件

1.協議是一種要求,或者一種規則 2.對程式來講,是只宣告,不實現 3.協議必須被某個類採納且在該類中給出協議中方法的函式體 4.對於採納協議的類,可以和其他類一樣使用建乙個協議myprotocol h檔案 import protocol czmyprotocol property nsstring...