zoukankan      html  css  js  c++  java
  • runtime 02-简单使用

    runtime机制为我们提供了一系列的方法让我们可以在程序运行时动态修改类、对象中的所有属性、方法。
    下面就介绍运行时一种很常见的使用方式,字典转模型。当然,你可能会说,“我用KVO直接 setValuesForKeysWithDictionary: 传入一个字典一样可以快速将字典转模型啊”,但是这种方法有它的弊端,只有遍历某个模型中所有的成员变量,然后通过成员变量从字典中取出对应的值并赋值最为稳妥,由于篇幅有限,这里暂且不讨论那么多,你权且当作多认识一种数据转模型的方式,以及初步认识一下runtime的强大。
    1、假设我定义了一个类(随便写的,不要纠结名字,.m文件啥也没写);
    1 @interface Lender : NSObject{
    2     CGFloat height;
    3 }
    4 @property (nonatomic, copy) NSString *name;
    5 @property (nonatomic, strong) NSNumber *age;
    6 @property (nonatomic, assign) int no;
    7 @end
     
    2、在其它文件使用这个类,注意:要使用运行时,必须先包含
    #import <objc/message.h>
    下面,我将会通过一小段代码来获取到这个类中所有的成员变量
     
    1 unsigned int outCount = 0;
    2 Ivar *vars = class_copyIvarList([Lender class], &outCount); // 获取到所有的变量列表
    3 // 遍历所有的成员变量
    4 for (int i = 0; i < outCount; i++) {
    5     Ivar ivar = vars[i]; // 取出第i个位置的成员变量
    6     constchar *propertyName = ivar_getName(ivar); // 通过变量获取变量名
    7     constchar *propertyType = ivar_getTypeEncoding(ivar); // 获取变量编码类型
    8     printf("---%s--%s
    ", propertyName, propertyType);
    9 }
    打印结果
    1 ---height--f
    2 ---_name--@"NSString"
    3 ---_age--@"NSNumber"
    4 ---_no--i
    可见,通过这几句简单的代码就可以获取到某个类中所有变量的名称和类型,然后通过object_setIvar()方法为具体某个对象的某个成员变量赋值。
     
     
  • 相关阅读:
    ORA-00119: invalid specification for system parameter REMOTE_LISTENER
    Standby Redo Log 的设定原则、创建、删除、查看、归档位置
    dataguard类型转换与模式转化
    Restore Points 制定回退方案
    11g dataguard 类型、保护模式、服务
    [置顶] 设计模式系列4-抽象工厂模式
    MediaInfo源代码分析 4:Inform()函数
    Codeforces Beta Round #51 D. Beautiful numbers
    如何将ER图转换成关系模式集
    建立简单的服务器端程序
  • 原文地址:https://www.cnblogs.com/ablettchen/p/4174912.html
Copyright © 2011-2022 走看看