美文网首页iOS面试
oc-Runtime学习(获取类中所有属性名)

oc-Runtime学习(获取类中所有属性名)

作者: SK丿希望 | 来源:发表于2018-05-19 11:04 被阅读8次

    类声明

    #import <Foundation/Foundation.h>
    #import <objc/runtime.h>
    @interface Person : NSObject{
        NSString *_variableString;
    }
    // 默认会是什么呢?
    @property (nonatomic, copy) NSString *name;
    
    // 默认是strong类型
    @property (nonatomic, strong) NSMutableArray *array;
    
    // 获取所有的属性名
    - (NSArray *)allProperties;
    @end
    

    类实现

    #import "Person.h"
    
    /// 表示Objective-C声明属性的不透明类型。
    typedef struct objc_property *objc_property_t;
    @implementation Person
    // 获取类的所有属性
    - (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;
    }
    @end
    

    外部使用

    - (void)viewDidLoad {
        [super viewDidLoad];
        Person *p = [[Person alloc] init];
        p.name = @"Lili";
        size_t size = class_getInstanceSize(p.class);
        NSLog(@"size=%ld", size);
        for (NSString *propertyName in p.allProperties) {
            NSLog(@"%@", propertyName);
        }
    }
    

    运行结果

    image.png

    相关文章

      网友评论

        本文标题:oc-Runtime学习(获取类中所有属性名)

        本文链接:https://www.haomeiwen.com/subject/rruodftx.html