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);
}
}