- runtime api 介紹
- 玩一下常用的api
- objc_系列函數(shù)關(guān)注于宏觀使用词渤,如類于協(xié)議的空間分配猫妙,注冊(cè),注銷等操作
- class_系列函數(shù)關(guān)注于類的內(nèi)部仰税,如實(shí)例變量构资,屬性,方法陨簇,協(xié)議等相關(guān)問(wèn)題
- object_系列函數(shù)關(guān)注于對(duì)象的角度吐绵,如實(shí)例變量
- method_系列函數(shù)關(guān)注于方法內(nèi)部,如方法的參數(shù)及返回值類型和方法的實(shí)現(xiàn)
- property_系列函數(shù)關(guān)注于屬性的內(nèi)部,如屬性的特性等
- protocol_系列函數(shù)關(guān)注于協(xié)議相關(guān)
- ivar_xxx函數(shù)關(guān)注于實(shí)例變量相關(guān)
- sel_xxx主要討論關(guān)于方法編號(hào)相關(guān)的東西
- imp_xxx主要討論關(guān)于方法實(shí)現(xiàn)相關(guān)
玩一下常用的api
// 創(chuàng)建類
Class SPCat = objc_allocateClassPair([NSObject class], "SPCat", 0);
// 添加實(shí)例變量
NSString *name = @"lzy";
class_addIvar(SPCat, name.UTF8String, sizeof(id), log2(sizeof(id)), @encode(id));
// 添加方法
class_addMethod(SPCat, @selector(hunting), (IMP)hunting, "v@:");
// 注冊(cè)類
objc_registerClassPair(SPCat);
NSLog(@"%@", SPCat);
// 創(chuàng)建實(shí)例對(duì)象
id cat = [[SPCat alloc] init];
[cat setValue:@"Tom" forKey:@"name"];
NSLog(@"name = %@", [cat valueForKey:@"name"]);
// 方法調(diào)用
[cat performSelector:@selector(hunting)];
// 交換方法
Method method1 = class_getMethodImplementation(self, @selector(viewWillAppear:));
Method method2 = class_getInstanceMethod(self, @selector(sp_viewWillAppear:));
-----------------------------
// 關(guān)聯(lián)屬性
- (void)setViewColor:(NSString *)viewColor {
objc_setAssociatedObject(self, &associatedObjectKey, @"addProperty", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)viewColor {
return objc_getAssociatedObject(self, &associatedObjectKey);
}
// 獲取成員變量列表
- (void)encodeWithCoder:(NSCoder *)coder {
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];
[coder encodeObject:value forKey:key];
}
}
說(shuō)明:本篇轉(zhuǎn)載自簡(jiǎn)書作者Cooci_和諧學(xué)習(xí)_不急不躁的文章iOS底層原理(二):Runtime研究(二)