OC runtime 底层API解析

  1. 关于class的API
1. object_getClass(instance) //获取isa指向的class
2. object_setClass(instance, [JWStudent class]);//设置isa指向的class
3. object_isClass(id) //判断是否是类对象
4. object_isMetaClass(Class cls) //判断是否是元类对象
5.      //动态创建一个类 跟使用
        Class newClass = objc_allocateClassPair([NSObject class], "JWCat", 0);
        //添加成员变量
        class_addIvar(newClass, "_age", sizeof(int), log2(_Alignof(int)), @encode(int));
        class_addIvar(newClass, "_weight", sizeof(NSString *), log2(_Alignof(NSString *)), @encode(NSString *));
        //添加方法
        class_addMethod(newClass, @selector(run), (IMP)test1, "v16@:0");
        //注册类
        objc_registerClassPair(newClass);
        //使用
        id cls = [[newClass alloc]init];
        //赋值
        [cls setValue:@12 forKey:@"_age"];
        [cls setValue:@"80kg" forKey:@"_weight"];
        [cls run];
        NSLog(@"%@----%@",[cls valueForKey:@"_age"],[cls valueForKey:@"_weight"]);

6.拷贝成员变量列表
        JWPerson * p = [JWPerson new];
        unsigned int count;
        Ivar * ivars = class_copyIvarList([JWPerson class], &count);
        for (int i = 0 ; i< count; i++) {
            Ivar ivar = ivars[i];
            NSLog(@"%s----%s",ivar_getName(ivar),ivar_getTypeEncoding(ivar));
        }
        free(ivars);

  1. 交换方法API
  • 替换方法的实现
class_replaceMethod(Class cls,IMP imp,const char *types);
  • 交换方法的实现
//交换方法
        Method m1 = class_getInstanceMethod([JWPerson class], @selector(print));
        Method m2 = class_getInstanceMethod([JWPerson class], @selector(test));
        
        method_exchangeImplementations(m1, m2);
        
        JWPerson * p = [JWPerson new];
        [p print];
        [p test];
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,758评论 0 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,939评论 25 708
  • 进入宿舍后,宿舍里其他的人已经到了,看到她们在一起谈天说地,欢声笑语。 又是一个人了呢,我笑了笑。 或...
    落月水清浅阅读 145评论 0 1
  • 在Netty中,每种Channel都有对应的配置,用ChannelConfig来表示,ChannelConfig是...
    沉沦2014阅读 1,832评论 0 0