• iOS runtime 运行时( 二 )


    我们在编程过程中,如果使用到了runtime(运行时),我们几乎都是想动态的改变这个类的信息,包括方法,属性,balabala的,并且获得这个类的一些信息,等等,下面我们就来看看怎么通过runtime提供的方法,来达到这些目的
    1). 获取 这个类的所有属性

    1 .h 文件
    2 
    3 @interface RTObj :NSObject
    4 @property(nonatomic,copy)NSString*name;
    5 @property(nonatomic,copy)NSString*webUrl;
    6 @property(nonatomic,copy)NSString*imageUrl;
    7 @property(nonatomic,copy)NSString*type;
    8 -(void)sort;
    9 @end
    View Code
     1 .m 文件
     2 
     3 @implementationRTObj
     4 @end
     5 获取这个类的所有属性,首先先包含#import<objc/message.h>,然后调用如下的方法
     6 
     7 unsigned int outCount =0;
     8 Ivar*vars = class_copyIvarList([RTObj class], &outCount);//获取到所有的成员变量列表
     9 //遍历所有的成员变量
    10 for(int i =0; i < outCount; i++) {
    11 Ivar ivar= vars[i];//取出第i个位置的成员变量
    12 constchar*propertyName = ivar_getName(ivar);//获取变量名
    13 constchar*propertyType = ivar_getTypeEncoding(ivar);//获取变量编码类型
    14 printf("---%s--%s
    ", propertyName, propertyType);
    15 //或者NSLog(@"---%s--%s
    ", propertyName, propertyType);
    16 }
    View Code

    打印结果

    ---_name--@"NSString"
    ---_webUrl--@"NSString"
    ---_imageUrl--@"NSString"
    ---_type--@"NSString"
    然后你就可以 自己去扩展自己的编程思路了,需要注意的是,父类的属相并不会打印出来,也就是 通过这个方法,获取不到父类的 属性
    2).改变该类的对象的某一个属性的值
    有这样一个对象

    RTObj*rtObj = [[RTObj alloc]init];

    现在通过 运行时提供的方法,来检查里面有没有 name这个属性,如果有就赋值,没有不赋值,

     1 RTObj*rtObj = [[RTObj alloc]init];
     2 unsigned int outCount =0;
     3 Ivar*vars =class_copyIvarList([rtObj class], &outCount);//获取到所有的成员变量列表
     4 //遍历所有的成员变量
     5 for(inti =0; i < outCount; i++) {
     6 Ivarivar = vars[i];//取出第i个位置的成员变量
     7 constchar*propertyName =ivar_getName(ivar);//获取变量名
     8 constchar*propertyType =ivar_getTypeEncoding(ivar);//获取变量编码类型
     9 NSString*proOcName = [NSString stringWithUTF8String:propertyName];
    10 if([proOcName isEqualToString:@"_name"])
    11 {
    12 object_setIvar(rtObj, ivar,@"孙悟空");
    13 }
    14 }
    15 NSLog(@"******:%@",rtObj.name);
    View Code

    最后的打印结果是
    **:**孙悟空

  • 相关阅读:
    System.InvalidOperationException异常的处理!vs15版
    五子棋项目的实现(四)具体的总结
    五子棋项目的实现(三)人机对战类的具体设计
    五子棋项目的实现(二)博弈树算法的描述
    五子棋项目的实现(一)
    java Exception和Error的区别
    java内存分配实例
    expdp与impdp
    SQL*PLUS下使用AUTOTRACE、sql顾问、实时sql监控
    Linux下如何将数据库脚本文件从sh格式变为sql格式
  • 原文地址:https://www.cnblogs.com/fengmin/p/5319095.html
Copyright © 2020-2023  润新知