iOS进阶+实战

runtime - api介绍

2019-11-05  本文已影响0人  SPIREJ

玩一下常用的api

// 创建类
Class SPCat = objc_allocateClassPair([NSObject class], "SPCat", 0);

// 添加实例变量
NSString *name = @"lzy";
class_addIvar(SPCat, name.UTF8String, sizeof(id), log2(sizeof(id)), @encode(id));

// 添加方法
class_addMethod(SPCat, @selector(hunting), (IMP)hunting, "v@:");

// 注册类
objc_registerClassPair(SPCat);

NSLog(@"%@", SPCat);

// 创建实例对象
id cat = [[SPCat alloc] init];
[cat setValue:@"Tom" forKey:@"name"];
NSLog(@"name = %@", [cat valueForKey:@"name"]);

// 方法调用
[cat performSelector:@selector(hunting)];

// 交换方法
Method method1 = class_getMethodImplementation(self, @selector(viewWillAppear:));
Method method2 = class_getInstanceMethod(self, @selector(sp_viewWillAppear:));

-----------------------------

// 关联属性
- (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];
    }
}

说明:本篇转载自简书作者Cooci_和谐学习_不急不躁的文章iOS底层原理(二):Runtime研究(二)

上一篇 下一篇

猜你喜欢

热点阅读