希望對大家有一點的幫助
首先蚓胸,第一個問題:
- runtime實現(xiàn)的機制是什么,怎么用驱富,一般用于干嘛灾螃?
這個問題我就不跟大家繞彎子了,直接告訴大家宽涌, runtime是一套比較底層的純C語言API, 屬于1個C語言庫, 包含了很多底層的C語言API媚值。 在我們平時編寫的OC代碼中, 程序運行過程時, 其實最終都是轉成了runtime的C語言代碼, runtime算是OC的幕后工作者
舉例:
//OC :
[[MJPerson alloc] init];
runtime下是怎么實現(xiàn)的 :
objc_msgSend(objc_msgSend("MJPerson" , "alloc"), "init")
- runtime 用來干什么呢?护糖?用在那些地方呢褥芒?怎么用呢?
runtime是屬于OC的底層, 可以進行一些非常底層的操作(用OC是無法現(xiàn)實的, 不好實現(xiàn))
在程序運行過程中, 動態(tài)創(chuàng)建一個類(比如KVO的底層實現(xiàn))
在程序運行過程中, 動態(tài)地為某個類添加屬性\方法, 修改屬性值\方法
遍歷一個類的所有成員變量(屬性)\所有方法 例如:我們需要對一個類的屬性進行歸檔解檔的時候屬性特別的多,這時候锰扶,我們就會寫很多對應的代碼献酗,但是如果使用了runtime就可以動態(tài)設置
舉例:
PYPerson.h的文件如下所示
import <Foundation/Foundation.h>
@interface PYPerson : NSObject @property (nonatomic, assign) int age; @property (nonatomic, assign) int height;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age2;
@property (nonatomic, assign) int height2;
@property (nonatomic, assign) int age3;
@property (nonatomic, assign) int height3;
@property (nonatomic, assign) int age4;
@property (nonatomic, assign) int height4;
@end
PYPerson.m實現(xiàn)文件
#import "PYPerson.h"
import <objc/runtime.h>
@implementation PYPerson
(void)encodeWithCoder:(NSCoder )encoder { 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 = [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
這樣我們可以看到歸檔和解檔的案例其實是runtime寫下的
學習,runtime機制首先要了解下面幾個問題 1相關的頭文件和函數(shù) 1> 頭文件
1.<objc/runtime.h>
2.<objc/message.h> 利用頭文件坷牛,我們可以查看到runtime中的各個方法罕偎!
2> 相關應用
NSCoding(歸檔和解檔, 利用runtime遍歷模型對象的所有屬性)
字典 --> 模型 (利用runtime遍歷模型對象的所有屬性, 根據(jù)屬性名從字典中取出對應的值, 設置到模型的屬性上)
KVO(利用runtime動態(tài)產生一個類)
用于封裝框架(想怎么改就怎么改) 這就是我們runtime機制的只要運用方向
3> 相關函數(shù)
1,class_copyPropertyList獲取一份拷貝的成員列表數(shù)組
2京闰,property_getName獲取成員名稱
3颜及,class_getInstanceVariable獲取成員對象的Ivar
4,object_getIvar從Ivar對象中取值
5蹂楣,object_setIvar賦值函數(shù)
6俏站,objc_msgSend:給對象發(fā)送消息
7,class_copyMethodList:遍歷某個類所有的方法
8痊土,class_copyIvarList:遍歷某個類所有的成員變量
9肄扎,class_ ...
4.必備常識 1> Ivar : 成員變量 2> Method : 成員方法 從上面例子中我們看到我們定義的成員變量,如果要是動態(tài)創(chuàng)建方法赁酝,可以使用Method