1.runtime實(shí)現(xiàn)的機(jī)制是什么,怎么用炮姨,一般用于干嘛腋舌?
runtime是一套比較底層的純C語言API, 屬于1個(gè)C語言庫, 包含了很多底層的C語言API塔嬉。 在我們平時(shí)編寫的OC代碼中, 程序運(yùn)行過程時(shí), 其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼, runtime算是OC的幕后工作者 比如說阳惹,下面一個(gè)創(chuàng)建對象的方法中钱烟,
舉例: OC :
<pre> [[MJPerson alloc] init] runtime :objc_msgSend(objc_msgSend("MJPerson" , "alloc"),"init")</pre>
2. runtime 用來干什么呢晰筛??用在那些地方呢拴袭?怎么用呢读第?
runtime是屬于OC的底層, 可以進(jìn)行一些非常底層的操作(用OC是無法現(xiàn)實(shí)的, 不好實(shí)現(xiàn))
? 在程序運(yùn)行過程中, 動(dòng)態(tài)創(chuàng)建一個(gè)類(比如KVO的底層實(shí)現(xiàn))
? 在程序運(yùn)行過程中, 動(dòng)態(tài)地為某個(gè)類添加屬性\方法, 修改屬性值\方法
遍歷一個(gè)類的所有成員變量(屬性)\所有方法 例如:我們需要對一個(gè)類的屬性進(jìn)行歸檔解檔的時(shí)候?qū)傩蕴貏e的多,這時(shí)候拥刻,我們就會(huì)寫很多對應(yīng)的代碼怜瞒,但是如果使用了runtime就可以動(dòng)態(tài)設(shè)置!
例如般哼,PYPerson.h的文件如下所示
<pre>
import<Foundation/Foundation.h>**
@interfacePYPerson : NSObject
@property (nonatomic, assign) int age;
@property(nonatomic, assign) int height;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age2;
@property (nonatomic, assign) intheight2;
@property (nonatomic, assign) int age3;
@property (nonatomic, assign)int height3;
@property (nonatomic, assign) int age4;
@property (nonatomic,assign) int height4;
@end
</pre>
而PYPerson.m實(shí)現(xiàn)文件的內(nèi)容如下
<pre>
import "PYPerson.h"
import<objc/runtime.h>
@implementationPYPerson
-(void)encodeWithCoder:(NSCoder)encoder {
unsigned int count = 0;
Ivar ivars = class_copyIvarList([PYPersonclass], &count);
// 取出i位置對應(yīng)的成員變量
for (int i = 0; i<count; i++) {
Ivar ivar = ivars[i]; // 查看成員變量
const char *name = ivar_getName(ivar);
// 歸檔
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[encoder encodeObject:value forKey:key];
}free(ivars); }
-(id)initWithCoder:(NSCoder*)decoder { if (self = [super init]) { unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PYPerson class], &count);
for (int i = 0; i<count; i++) {
// 取出i位置對應(yīng)的成員變量
Ivar ivar = ivars[i];
// 查看成員變量
const char *name = ivar_getName(ivar);
// 歸檔
NSString *key = [NSString stringWithUTF8String:name];
id value = [decoder decodeObjectForKey:key];
[self setValue:value forKey:key]; // 設(shè)置到成員變量身上
}
free(ivars);
}
return self;
}
@end
</ pre>
</pre>
3.runtime機(jī)制首先要了解下面幾個(gè)問題
1>.相關(guān)的頭文件和函數(shù) 1> 頭文件
<objc/runtime.h>
<objc/message.h>利用頭文件吴汪,我們可以查看到runtime中的各個(gè)方法!
2> 相關(guān)應(yīng)用
?NSCoding(歸檔和解檔, 利用runtime遍歷模型對象的所有屬性)
?字典--> 模型 (利用runtime遍歷模型對象的所有屬性, 根據(jù)屬性名從字典中取出對應(yīng)的值, 設(shè)置到模型的屬性上)
?KVO(利用runtime動(dòng)態(tài)產(chǎn)生一個(gè)類)
?用于封裝框架(想怎么改就怎么改) 這就是我們r(jià)untime機(jī)制的只要運(yùn)用方向
>3.相關(guān)函數(shù)
?objc_msgSend : 給對象發(fā)送消息
?class_copyMethodList: 遍歷某個(gè)類所有的方法
?class_copyIvarList: 遍歷某個(gè)類所有的成員變量
?class_..... 這是我們學(xué)習(xí)runtime必須知道的函數(shù)逝她!
>.4.必備常識(shí)
1> Ivar : 成員變量
2> Method : 成員方法從上面例子中我們看到我們定義的成員變量浇坐,如果要是動(dòng)態(tài)創(chuàng)建方法,可以使用Method黔宛,
<a >Github使用runtime解決UserDefault存儲(chǔ)問題</a>
<a href="http://www.reibang.com/p/927c8384855a">相關(guān)理解</a>