runtime即運(yùn)行時(shí)這是一個(gè)基于比較底層的C語言的API,oc的幕后操作者,oc代碼在運(yùn)行時(shí)由編譯器將其轉(zhuǎn)為runtime的c語言代碼其中最主要的就是消息機(jī)制,oc在調(diào)用函數(shù)是會變成一條消息發(fā)送出去屬于動(dòng)態(tài)過程即在編譯的時(shí)候并未決定真正調(diào)用的那個(gè)函數(shù)事實(shí)證明,只有在運(yùn)行時(shí)才會根據(jù)函數(shù)的名稱找到對應(yīng)函數(shù)的調(diào)用.
簡單實(shí)例:
解檔歸檔:當(dāng)屬性只有幾個(gè)的時(shí)候可以輕松寫完,如果有幾十個(gè)屬性呢
- (id)initWithCoder:(NSCoder *)aDecoder {
2 if (self = [super init]) {
3 unsigned int outCount;
4 Ivar * ivars = class_copyIvarList([self class], &outCount);
5 for (int i = 0; i < outCount; i ++) {
6 Ivar ivar = ivars[i];
7 NSString * key = [NSString stringWithUTF8String:ivar_getName(ivar)];
8 [self setValue:[aDecoder decodeObjectForKey:key] forKey:key];
9 }
10 }
11 return self;
12 }
13
14 - (void)encodeWithCoder:(NSCoder *)aCoder {
15 unsigned int outCount;
16 Ivar * ivars = class_copyIvarList([self class], &outCount);
17 for (int i = 0; i < outCount; i ++) {
18 Ivar ivar = ivars[i];
19 NSString * key = [NSString stringWithUTF8String:ivar_getName(ivar)];
20 [aCoder encodeObject:[self valueForKey:key] forKey:key];
21 }
22 }