iOS面试

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

2018-05-19  本文已影响8人  SK丿希望

类声明

#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
上一篇 下一篇

猜你喜欢

热点阅读