在新闻等实时性不太高的项目中,为了保证用户体验,常常会做一定的磁盘缓存的功能。通常我们用的是轻量级的sql。做数据存储的时候,需要创建表结构。方法:表名做为所需存储模型的的类名;表的字段做为属性名,字段的值做为属性值。
问题来了,使用数据库的时候需要插入和查询等,如何知道一个类的所有属性然后进行相应的查询和插入删除操作就需要用到rumetime的方法查询这个类的所有属性。
代码如下:
@interface Dog : NSObject @property(nonatomic,copy)NSString * sex; @property(nonatomic,assign)NSInteger * age; @property(nonatomic,assign)int ID; @property(nonatomic,strong)NSArray * parents; @end uint propertyCount; //获取Dog的所有属性名称的数组,和属性的个数 objc_property_t *ps = class_copyPropertyList([Dog class], &propertyCount); for (uint i = 0; i < propertyCount; i++) { objc_property_t property = ps[i]; //属性名 const char *propertyName = property_getName(property); //属性的描述 /* 第一:T总是第一个,它代表类型。 对于类类型,它都是T@ "类型" ,其中@表示对象类型;对于id类型,它就是@;而对于基本数据类型,它都是 T 加上编码类型(@encode(type)),比如int类型就是Ti。 第二:表示属性编码类型,比如是C表示copy,&表示strong,W表示weak等。待会再详细地说明。若是基本类型,它默认是assign,因此此时它是空的。 第三:指定是nonatomic还是atomic,若是nonatomic,则用N表示,若是atomic,则值为空。比如上面的count属性的详细描述为:Ti,N,V_count,它表示int类型、nonatomic、成员变量名为_count;而上面的atomicProperty属性的详细描述为:T@ "NSNumber" ,&,V_atomicProperty,它表示类型为NSNumber且为对象类型、strong、atomic、成员变量名为_atomicProperty。 第四:在详细描述中,属性名称是V开头,后面跟着成员变量名称 */ const char *propertyAttributes = property_getAttributes(property); NSString* type = [NSString stringWithUTF8String:propertyAttributes]; NSLog(@"propertyName==%s,type==%@",propertyName,type); }
这里需要注意的是,需要根据自己的业务要求,创建表的时候用到相应的属性,不一定要用该类的属性描述,只需要注意最后的查询就好了。