iOS-runtime

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);

你可能感兴趣的:(iOS-runtime)