运行时是 OC 的核心,其特点就是程序在运行的时候,以发送消息的形式调用方法.
在实际开发中,关于运行时方面的运用点,其实并不多,最常用的也无非是动态获取对象的属性.
示例:
1.新建一个继承自NSObject 的对象,在. h 文件声明2个属性
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
2.新建一个 NSObject 的类别
.h 文件
#import <Foundation/Foundation.h>
@interface NSObject (Runtime)
+(NSArray*)zyfObjProperties;
@end
.m 文件
#import "NSObject+Runtime.h"
#import <objc/runtime.h>
@implementation NSObject (Runtime)
+(NSArray *)zyfObjProperties{
//调用运行时方法,取得类的属性列表
//Ivar 成员变量
//Method 方法
//Property 属性
//Protocol 协议
unsigned int count = 0;
objc_property_t *proList = class_copyPropertyList([self class], &count);
NSMutableArray *mArr = [NSMutableArray array];
for (unsigned int i = 0; i < count; i++) {
//从数组中取得属性
objc_property_t pty = proList[i];
//从中获得属性名称
const char *cName = property_getName(pty);
NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
[mArr addObject:name];
}
NSLog(@"属性的个数 %d", count);
free(proList);
return mArr.copy;
}
@end
3.导入新建的类和分类,然后调用
NSArray *properties = [Person zyfObjProperties];
NSLog(@"%@",properties);
注意, c语言的 copy 后,需要释放,oc 在运行时是不会对 c 做自动内存管理的.