使用场景
开发过程中,有时候我们可能会用到对象的属性名称,例如@property (nonatomic,copy)UILable * IDLable
,取出属性名称名称就可以根据名称来创建字典或者构建模型,字典的键(实体类中的属性)为ID(大写),值为IDLable.text。那么这么一来,向服务器上传字段的时候就不需要一个一个手敲,而是根据控件的名称来自动创建字典来上传了,是不是很方便?
涉及到的方法
1.需要导入的头文件
#import <objc/runtime.h>
2.获取目标对象内所有的属性和变量的方法
Ivar * class_copyIvarList(Class cls, unsigned int *outCount);
3.获取指定的对象
id object_getIvar(id object, Ivar ivar)
4.获取指定对象的对象名
const char * ivar_getName(Ivar ivar)
范例代码
封装好的方法,传入指定的属性,返回属性名称
- (NSString *)nameWithInstance:(id)instance
{
unsigned int numIvars = 0;
NSString *key=nil;
//获取指定对象中的多有成员变量和属性,self.target指目标对象,需要替换
Ivar * ivars = class_copyIvarList([self.target class], &numIvars);
for(int i = 0; i < numIvars; i++) {
//遍历出目标对象内单个的成员变量或者属性
Ivar thisIvar = ivars[i];
const char *type = ivar_getTypeEncoding(thisIvar);
NSString *stringType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
//筛选出成员变量
if (![stringType hasPrefix:@"@"]) {
continue;
}
//获取当前成员变量的内存地址和传入参数比对
if ((object_getIvar(self.target, thisIvar) == instance)) {
//获取属性名称
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
break;
}
}
free(ivars);
return key;
}