简介
运行时是一种面向对象的编程语言的运行环境。类似于Java的虚拟机;
OC最主要的特点就是在程序运行时,以发送消息的方式调用方法;
运行时是OC的核心,Objective-C就是基于运行时的;
利用 clang 生成中间代码
进入终端,输入以下命令:
$ clang -rewrite-objc main.m
可以将OC的代码重写成C++的代码
一、使用Runtime获取类的属性列表
创建一个Person类,获取这个类的属性
XZPerson.h中:
#import
<Foundation/Foundation.h>
@interface
XZPerson :
NSObject
@property
(
nonatomic
,
copy
)
NSString
*name;
@property
(
nonatomic
,
assign
)
int
age;
@property
(
nonatomic
,
assign
)
int
weight;
@end
创建一个NSObject的分类Runtime,用来获取Person类的属性列表
#import
<Foundation/Foundation.h>
NSObject+XZRuntime.h
中:
@interface
NSObject (XZRuntime)
//
获取类的属性列表
// @return
类的属性列表数组
+ (
NSArray
*)xz_objcProperties;
@end
NSObject+XZRuntime.m
中:
#import
"NSObject+XZRuntime.h"
#import
<objc/runtime.h>
@implementation
NSObject (XZRuntime)
+ (
NSArray
*)xz_objcProperties {
// class_copyIvarList Ivar
成员变量
// class_copyPropertyList Property
属性
// class_copyMethodList Method
方法
// class_copyProtocolList Protocol
协议
//
参数一:要获取的类
参数二:类属性的个数指针
//
返回值:所有属性的
'
数组
'
,
C
语言中,数组的名字,就是指向第一个元素的地址
unsigned
int
outCount =
0
;
//
调用运行时方法,取得类的属性列表
objc_property_t
*proList =
class_copyPropertyList
([
self
class
], &outCount);
NSLog
(
@"
属性列表的数量
%d"
,outCount);
NSMutableArray
*array = [
NSMutableArray
array
];
//
遍历所有的属性
for
(
unsigned
int
i =
0
; i < outCount; i++) {
//1.
从数组中取得属性
C
语言的结构体指针,通常不需要
'*'
objc_property_t
pty = proList[i];
// 2.
从
pty
中获得属性的名称
const
char
*cName =
property_getName
(pty);
//
将
C
语言字符串转化成
OC
字符串
NSString
*name = [
NSString
stringWithCString
:cName
encoding
:
NSUTF8StringEncoding
];
// 3.
属性名称添加到数组
[array
addObject
:name];
}
// retain/create/copy
需要
release
,点击
option + click
查看
//
释放数组
free
(proList);
return
array.
copy
;
}
XZRunTimeController.m
中:
#import
"XZPerson.h"
#import
"NSObject+XZRuntime.h"
//
目标:获取属性数组
NSArray
*personProperties = [
XZPerson
xz_objcProperties
];
NSLog
(
@"%@"
,personProperties);