Runtime之获取属性的名称

使用场景

开发过程中,有时候我们可能会用到对象的属性名称,例如@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;
}

参考链接

参考链接:http://my.oschina.net/taptale/blog/110626

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容