RumTime小結(jié)

? ? ? ? ? ? ? ? 這幾天看了一些runtime的內(nèi)容,也在項目中的 "UIActionSheet+Blocks.h" 看到了它的影子。所以根據(jù)自己的理解寫點心得,理解的也許有誤差的地方而且理解的也不是很全面,以后會為這篇runtime多多修改和添加的。??

? ? ? ? ? ? ? ?首先 runtime:為運行機制,用c和匯編寫的。因為OC語言是一個動態(tài)的語言,它會把一些工作推遲到運行時去執(zhí)行。這樣但靠編譯器是不夠的(c語言可以),所有runtime就有了存在的意義。runtime分為“mordern”和"leyacy"兩個版本,mordern是我們現(xiàn)在? 使用的,是支持64位的,leyacy是之前的,是在32位環(huán)境下使用的。? 當(dāng)我們調(diào)用一個[objc makeTest]的時候,我們都知道是這個objc這個對象去調(diào)用makeTest這個方法,在runtime下它會轉(zhuǎn)化成objc_msgSend(obj,@selector(makeTest)),在objc_msgSend這個函數(shù)中,會通過obj的isa指針去找到obj相對應(yīng)的類,然后在在這個類的cache(方法的緩存池,這樣可以更快更高效的去查找方法)中,根據(jù)SEL(方法選擇器)去查找對應(yīng)的makeTest方法,如果cache中沒有的話,再去這個類的methodList(方法列表)中查找,如果在methodList沒有的話就去它的superClass中去查找,如果查找到了,就把這個makeTest方法放入cache中以方便下次查找。 介紹幾個runtime中的方法,也可以去文件中去查看。

1? id object_copy(id obj, size_t size)? 對象拷貝,內(nèi)存地址為同一個。

2? id object_dispose(id obj )? 釋放對象 作用和release差不多.

3? Class object_getClass(id obj)? 獲取一個類

4? const char *object_getClassName(id obj) 獲取一個類的類名? 和[NSStringFormClass] 的作用一樣

5? BOOL class_addMethod(Class cls, SEL name, IMP imp,? const char *types) 給一個類添加方法? ? class:類 SEL name: 方法名 IMP:這個類似于函數(shù)指針的東西,后面跟函數(shù)名字, types為參數(shù)

6? Method *class_copyMethodList(Class cls, unsigned int *outCount) 獲取某個類中的所有方法 已經(jīng)實現(xiàn)的方法

u_int count;

Method *method = class_copyMethodList([CustomClass class], &count);

for (int i = 0 ; i < count; ++i) {

SEL name = method_getName(method[i]);

NSString *strName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];

NSLog(@"%@", strName);

}? ? 這是自己寫的一個獲取CustomClass(隨便寫的一個類)的所有方法,我理解為它返回的是一個關(guān)于方法的數(shù)組,然后根據(jù) method_getName()? 把方法轉(zhuǎn)換為方法選擇器,在根據(jù)sel_getName(name) 轉(zhuǎn)為c語言的字符串,然后一次打印出來

7? objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)? 這是返回某個類中所有的屬性

u_int mcount;

objc_property_t *property = class_copyPropertyList([CustomClass class], &mcount)count);

for ( int i = 0 ; i < mcount; ++i) {

const char* propertyName= property_getName(property[i]);

NSString *strName = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];

NSLog(@"%@",strName);

}

8? Method class_getInstanceMethod(Class cls, SEL name) 替換某個的類的方法

CustomClass *custom =[ [CustomClass alloc]init];

Method? mMethod= class_getInstanceMethod([CustomClass class], @selector(fun1));un1))

Method mMethod1 = class_getInstanceMethod([CustomClass class], @selector(fun2));

method_exchangeImplementations(mMethod1,mMethod);

我在這個類中寫了fun1(執(zhí)行打印fun1)和fun2(去打印fun2)的兩個方法,然后我去執(zhí)行這個方法 當(dāng)我去執(zhí)行[ custom fun1]的時候打印出來的是fun2 里面的方法已經(jīng)替換的,我的理解 是fun1的IMP指向了fun2所對應(yīng)的執(zhí)行函數(shù)。他們替換了IMP的指向函數(shù)

9 在項目的UIActionSheet+Blocks.h 我們會看到? objc_setAssociatedObject(self, UIActionSheetTapBlockKey, tapBlock, OBJC_ASSOCIATION_COPY); 這個函數(shù),他的作用是用了添加屬性,self為為那個類添加,(這里是本類),UIActionSheetTapBlockKey是添加屬性對應(yīng)的key,必須為唯一標示。這個通知差不多。tapBlock 為添加的屬性, OBJC_ASSOCIATION_COPY 是屬性類型,這里是copy (因為添加的是block 所有用的是copy)? ? 然后通過objc_getAssociatedObject(self, UIActionSheetTapBlockKey);可以獲得這個屬性

最后編輯于
?著作權(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)容