ios - 如何使用runtime获取该类中类别的属性名称?
迷茫
迷茫 2017-04-17 17:58:40
[iOS讨论组]

我测试了一下 目前没有发现可以获取类别中属性的方法 以及途径 by runtime

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
PHP中文网

获取property list:
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList([self class], &count);
获取property名:
const char *propertyName = property_getName(properties[index])
使用KVC获取property值:
id propertyValue = [self valueForKey:name];

高洛峰

类别中的属性是关联对象,用key来获取。

阿神
- (NSArray *)allProperties {
    unsigned int count;
    
    // 获取类的所有属性
    // 如果没有属性,则count为0,properties为nil
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count];
    
    for (NSUInteger i = 0; i < count; i++) {
        // 获取属性名称
        const char *propertyName = property_getName(properties[i]);
        NSString *name = [NSString stringWithUTF8String:propertyName];
        
        [propertiesArray addObject:name];
    }
    
    // 注意,这里properties是一个数组指针,是C的语法,
    // 我们需要使用free函数来释放内存,否则会造成内存泄露
    free(properties);
    
    return propertiesArray;
}
- (NSDictionary *)allPropertyNamesAndValues {
    NSMutableDictionary *resultDict = [NSMutableDictionary dictionary];
    
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    
    for (int i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        const char *name = property_getName(property);
        
        // 得到属性名
        NSString *propertyName = [NSString stringWithUTF8String:name];
        
        // 获取属性值
        id propertyValue = [self valueForKey:propertyName];
        
        if (propertyValue && propertyValue != nil) {
            [resultDict setObject:propertyValue forKey:propertyName];
        }
    }
    
    // 记得释放
    free(properties);
    
    return resultDict;
}

更多细节可以看这篇文章中体验即可:点击进入

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号