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...