1 查找类的所有属性和访问属性
import
//先导入runtime库文件
unsigned int count = 0;
//所有属性名 获得指定类里面所有属性
object_getClass(car) 可以获取对象的真实的类,防止工厂模式设计
Ivar *members = class_copyIvarList([Car class], &count);
for (int i = 0 ; i < count; i++) {
Ivar var = members[i];
const char *memberName = ivar_getName(var);
const char *memberType = ivar_getTypeEncoding(var);
NSLog(@"%s----%s---%d", memberName, memberType,i);
}
//如果要访问的是结构体类型转换为id类型用下列方法
NSValue *v=[NSValue valueWithCGRect:CGRectMake(290, 0, 30, 44)];
//打印指定对象里面第几个属性
id i =object_getIvar(car, members[0]);
NSLog(@"%@",i);
//访问属性可以用KVC,或者如果属性有get方法,set方法,用下列方法也可以
[i performSelector:@selector(setFrame:) withObject:v];
2 获得方法的真实地址
//不需要导入runtime库
//后面参数是一种省略的写法,也可以写具体
typedef void (*_VIMP)(id,SEL,...);
Person *p = [[Person alloc] init];
//返回的 IMP是方法的真实的地址,不过只允许使用2个参数,我们可以对IMP进行强制转型
// 这样通过IMP指针,就可以直接访问方法了,需要通过消息机制
//我们定义的VIMP指针,第一个参数,是对象,第一个是对象一个@selector()方法名,后面都是方法的参数
_VIMP imp_test1 = (_VIMP)[p methodForSelector:@selector(test: andt1: andt2: andt3:)];
imp_test1(p,@selector(test: andt1: andt2: andt3:),0,1,2,3);