iOS-runtime

1 查找类的所有属性和访问属性

import <objc/runtime.h>

//先导入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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容