runtime 運行時機制 完全解讀

480618.jpg

1.runtime實現的機制是什么,怎么用,一般用于干嘛?

runtime是一套比較底層的純C語言API, 屬于1個C語言庫, 包含了很多底層的C語言API。 在我們平時編寫的OC代碼中, 程序運行過程時, 其實最終都是轉成了runtime的C語言代碼, runtime算是OC的幕后工作者 比如說,下面一個創建對象的方法中,
舉例: OC :
<pre> [[MJPerson alloc] init] runtime :objc_msgSend(objc_msgSend("MJPerson" , "alloc"),"init")</pre>

2. runtime 用來干什么呢??用在那些地方呢?怎么用呢?

runtime是屬于OC的底層, 可以進行一些非常底層的操作(用OC是無法現實的, 不好實現)

? 在程序運行過程中, 動態創建一個類(比如KVO的底層實現)
? 在程序運行過程中, 動態地為某個類添加屬性\方法, 修改屬性值\方法
遍歷一個類的所有成員變量(屬性)\所有方法 例如:我們需要對一個類的屬性進行歸檔解檔的時候屬性特別的多,這時候,我們就會寫很多對應的代碼,但是如果使用了runtime就可以動態設置!
例如,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實現文件的內容如下

<pre>

import "PYPerson.h"

import<objc/runtime.h>

@implementationPYPerson
-(void)encodeWithCoder:(NSCoder)encoder {
unsigned int count = 0;
Ivar ivars = class_copyIvarList([PYPersonclass], &count);
// 取出i位置對應的成員變量
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位置對應的成員變量
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]; // 設置到成員變量身上
}
free(ivars);

}
return self;
}
@end
</ pre>
</pre>

3.runtime機制首先要了解下面幾個問題

1>.相關的頭文件和函數 1> 頭文件

<objc/runtime.h>

<objc/message.h>利用頭文件,我們可以查看到runtime中的各個方法!

2> 相關應用

?NSCoding(歸檔和解檔, 利用runtime遍歷模型對象的所有屬性)

?字典--> 模型 (利用runtime遍歷模型對象的所有屬性, 根據屬性名從字典中取出對應的值, 設置到模型的屬性上)

?KVO(利用runtime動態產生一個類)

?用于封裝框架(想怎么改就怎么改) 這就是我們runtime機制的只要運用方向

>3.相關函數

?objc_msgSend : 給對象發送消息

?class_copyMethodList: 遍歷某個類所有的方法

?class_copyIvarList: 遍歷某個類所有的成員變量

?class_..... 這是我們學習runtime必須知道的函數!

>.4.必備常識

1> Ivar : 成員變量
2> Method : 成員方法從上面例子中我們看到我們定義的成員變量,如果要是動態創建方法,可以使用Method,
<a >Github使用runtime解決UserDefault存儲問題</a>
<a href="http://www.lxweimin.com/p/927c8384855a">相關理解</a>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 簡介 Runtime 又叫運行時,是一套底層的 C 語言 API,其為 iOS 內部的核心之一,我們平時編寫的 O...
    隨風飄蕩的小逗逼閱讀 991評論 0 0
  • 對于從事 iOS 開發人員來說,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,733評論 7 64
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,776評論 0 9
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,158評論 0 9
  • 最近,我感覺自己像個抑郁癥患者,總是無緣無故的憂傷,無緣無故對著窗外落淚,無緣無故想起小時候的很多事情,無緣無故想...
    莘茹聲音療愈顧問閱讀 444評論 4 9