去面一个有一年以上工作年限的ios开发岗位,如果面试官不是搞技术的,runtime一般问不到,但凡是一个懂技术的面试官面一个一年以上的求职者,runtime运行机制是多半会问到的,runtime非常强大,很多人都败在它魔爪之下,当然我在项目中还没有用到过runtime,一般比较好点的三方库都会使用到runtime,比如:MJExtension、AFNetworking等。
今天就自己遇到的一个项目中的技术点,学习了一哈runtime,今天就总结一下学习的知识点。
Runtime
机制可以在程序运行时动态修改类、对象中的所有属性、方法等。
#import <objc/runtime.h>
2:获取一个对象或类中的所有方法: class_copyMethodList([self class], &outCount);
unsigned int count;
Method* methods = class_copyMethodList([self class], &count);
for (unsigned i; i<count; i++) {
// 获取方法名称,但是类型是一个SEL选择器类型
SEL methodSEL = method_getName( methods[i]);
// 需要获取C字符串
const char *name1 = sel_getName(methodSEL);
// 将方法名转换成OC字符串
NSString *methodName = [NSString stringWithUTF8String:name1];
// 获取方法的参数列表
int arguments = method_getNumberOfArguments( methods[i]);
NSLog(@"方法名:%@, 参数个数:%d", methodName, arguments);
}
free(name count);//避免内存泄漏
3:获取一个对象或类中的所有属性名及对应的值:class_copyPropertyList([self class], &count);
unsigned int count;
objc_property_t * namecount = class_copyPropertyList([self class], &count);
for (unsigned i; i<count; i++) {
const char * name = property_getName(namecount[i]);
// 得到属性名
NSString *propertyName = [NSString stringWithUTF8String:name];
NSLog(@"%@",propertyName);
// 获取属性值
id propertyValue = [self valueForKey:propertyName];
NSLog(@"%@",propertyValue);
}
free(name count);//避免内存泄漏
unsigned int count = 0;
写到这里只列举了一部分功能,当然我们获取到这么属性名、或变量名有什么作用了,当然是很实用的了,这时候我们可以根据需求,对某个变量名利用kvc技术获取其对应的值,例如:无论是在xib或代码中都无法修改placeholder的颜色及其大小,这是就需要利用runtime机制获取UITextField的所有变量名,看是否存在没有公开的属性或变量名,
_placeholderLabel变量名就是,这时候就会发现确实存在,那么就可以利用kvc机制获取对应的对象 并改变功能
改变UITextField placeholder文字颜色及大小 kvc机制