運行時是 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 做自動內存管理的.