1、包含运行时头文件
#import <objc/runtime.h>
2、获取某个类的成员变量或则属性;
unsigned int numIvars; //成员变量个数
Ivar *vars = class_copyIvarList(NSClassFromString(@"UIView"), &numIvars);
//Ivar *vars = class_copyIvarList([UIView class], &numIvars);
NSString *key=nil;
for(int i = 0; i < numIvars; i++) {
Ivar thisIvar = vars[i];
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; //获取成员变量的名字
NSLog(@"variable name :%@", key);
key = [NSString stringWithUTF8String:ivar_getTypeEncoding(thisIvar)]; //获取成员变量的数据类型
NSLog(@"variable type :%@", key);
}
free(vars);
每次迭代到非objective-c对象的时候,如基本数据类型,BOOL、int、float就会报错。
- (NSString *)nameWithInstance:(id)instance
{
unsigned
int
numIvars = 0;
NSString *key=nil;
Ivar * ivars = class_copyIvarList([self.target
class
], &numIvars);
for
(
int
i = 0; i < numIvars; i++) {
Ivar thisIvar = ivars[i];
const
char
*type = ivar_getTypeEncoding(thisIvar);
NSString *stringType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
if
(![stringType hasPrefix:@
"@"
]) { //迭代到非objective-c对象的时候 解决报错
continue
;
}
if
((object_getIvar(self.target, thisIvar) == instance)) {
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
break
;
}
}
free
(ivars);
return
key;
}
3、获取成员函数
Method *meth = class_copyMethodList(NSClassFromString(@"UIView"), &numIvars);
//Method *meth = class_copyMethodList([UIView class], &numIvars);
for(int i = 0; i < numIvars; i++) {
Method thisIvar = meth[i];
SEL sel = method_getName(thisIvar);
const char *name = sel_getName(sel);
NSLog(@"zp method :%s", name);
}
free(meth);