1.初識runtime###
Runtime 運行時 用于對于APP流暢度數(shù)據(jù)加載效率要求較高的App,是一個運行時庫(Runtime Library),使用的是C語言、匯編語言進(jìn)行編寫。通過Runtime機(jī)制,為C語言添加了面向?qū)ο?/strong>的特性,得到我們使用的Objective-C語言。
2.runtime簡單用法###
(1)函數(shù)調(diào)用:消息機(jī)制####
消息機(jī)制 —>
接受體:對象
消息:函數(shù)
[objc method];
翻譯成 —>
objc_msgSend( objc, @selector( method ) );
objc代表的是本類self
objc_msgSend( objc, methodlist) //methodlist指向本類super objc_msgSend( super_objc, methodlist ) //Methodlist指向父類,super_objc本質(zhì)也指向objc
例如:
OC寫法:
[self createUI];
runtime寫法:
objc_msgSend(self, @selector(createUI));
再如:
OC寫法:
[self startRequestWithURL:@"http://www.baidu.com"];
runtime 寫法
objc_msgSend(self, @selector(startRequestWithURL:),@"http://www.baidu.com");
注意:使用runtime需要導(dǎo)入頭文件
#import <objc/runtime.h>
#import <objc/message.h>
2.動態(tài)的關(guān)聯(lián)屬性####
runtime可以進(jìn)行,與動態(tài)擴(kuò)展有關(guān)的還有類別
但是類別只能功能擴(kuò)展,無法擴(kuò)展屬性
可以對屬性擴(kuò)展的有:
1、靜態(tài)屬性
2、使用運行時擴(kuò)展屬性(關(guān)聯(lián))
實現(xiàn)屬性的關(guān)聯(lián)(在類別中擴(kuò)展):
1、在類別里創(chuàng)建一個靜態(tài)的指針(key)
static void * v_key;
2、實現(xiàn)相應(yīng)的getter、setter方法
@property id myValue;
—>
- (void)setMyValue:(id)objc{objc_setAssociatedObject(self, v_key, myValue, OBJC_ASSOCIATION_RETAIN);}
-(id)myValue{objc_getAssociatedObject(self, v_key);
}
例如:
定義一個類別NSString+MyCategary 在其中對NSString 進(jìn)行屬性擴(kuò)展,定義一個屬性name,類型為NSString,當(dāng)操作時會產(chǎn)生錯誤
[__NSCFConstantString setName:]: unrecognized selector sent to instance 0x10a6670d0
因此需要對name的getter和setter方法進(jìn)行擴(kuò)展,擴(kuò)展方法為
static void * key = @"key";
- (void)setName:(NSString *)name{
// self.name = name;//OC寫法
/*
參數(shù)說明:
1.調(diào)用的對象self
2.靜態(tài)的C語言指針,保證set/get方法操作的是同一個對象
3.賦予的值
4.賦值的變量屬性修飾符
*/
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString*)name{
// return self.name;//OC寫法
return objc_getAssociatedObject(self, key);
}
當(dāng)然這些知識初識runtime用法,更多信息后續(xù)補充。。。