iOS底層原理(二):Runtime研究(二)
阿新 • • 發佈:2018-11-05
這個篇幅我們繼續研究
Runtime
,這裡給大家介紹Runtime的API
- Working with Classes
- Adding Classes
- Instantiating Classes
- Working with Instances
- Obtaining Class Definitions
- Working with Instance Variables
- Associative References
- Sending Messages
- Working with Methods
- Working with Libraries
- Working with Selectors
- Working with Protocols
- Working with Properties
- Using Objective-C Language Features
- Class-Definition Data Structures
- Instance Data Types
- Boolean Value
- Associative References
- Constants
- objc_系列函式關注於巨集觀使用,如類與協議的空間分配,註冊,登出等操作
- class_系列函式關注於類的內部,如例項變數,屬性,方法,協議等相關問題
- objcet_系列函式關注於物件的角度,如例項變數
- method_系列函式關注於方法內部,如果方法的引數及返回值型別和方法的實現
- property_系類函式關注與屬性*內部,如屬性的特性等
- protocol_系類函式關注與協議相關
- ivar_xxx函式關注與例項變數的東西
- sel_xxx主要討論關於方法編號相關的東西
- imp_xxx主要討論關於方法實現相關的
下面我們來玩一下這些常用的api
//交換方法
Method m1 = class_getInstanceMethod(self, @selector(viewWillAppear:));
Method m2 = class_getInstanceMethod(self, @selector(tz_viewWillAppear:));
method_exchangeImplementations(m1, m2);
// 關聯屬性
- (void)setViewColor:(NSString *)viewColor{
objc_setAssociatedObject(self, &associatedObjectKey, @"addProperty", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)viewColor{
return objc_getAssociatedObject(self, &associatedObjectKey);
}
/// 建立一類對
Class TZCat = objc_allocateClassPair([NSObject class], "TZCat", 0);
/// 新增例項變數
// const char* types= " [email protected]:"
NSString* name = @"name";
class_addIvar(TZCat, name.UTF8String, sizeof(id), log2(sizeof(id)), @encode(id));
// 新增方法
class_addMethod(TZCat, @selector(hunting), (IMP)hunting, "[email protected]:");
/// 註冊類
objc_registerClassPair(TZCat);
// 建立例項物件
id cat = [[TZCat alloc] init];
[cat setValue:@"Tom" forKey:@"name"];
NSLog(@"name = %@", [cat valueForKey:name]);
/// 方法呼叫
[cat performSelector:@selector(hunting)];
// 獲取成員變數列表
unsigned int count = 0;
Ivar* ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i++) {
Ivar var = ivars[i];
const char* name = ivar_getName(var);
NSString* key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
free(ivars);
以上就是這篇文章的全部內容了,希望本文的內容對大傢俱有一定的參考學習價值,同時歡迎大家進入小編交流群:624212887,一起交流學習,謝謝大家的支援