runtime的总结

2018-10-25  本文已影响0人  CYG斗战佛

这段时间招人,也自己出去面试了几家,发现现在iOS出去面试,关于runtime是个必问的问题,确实在iOS的开发中runtime的用处太多了,废话不多说,开始正文

runtime是什么

关于这个网上有很多很多的资料了,runtime可以理解为是一套封装了C语言API的三方库,我们所编写的所有的OC代码最终都要转换为C语言的代码。
直接上一些干货吧,面试的时候回被问到的

runtime在项目中的应用

消息的发送

借用别人的一幅讲解isa指针的 以及实例对象、类对象之间关系的图解


实例对象/类对象及isa之间关系图解

系统所提供的三种方法容错机制

当我们沿着父类,到根类还是没有找到对应的方法实现的话,系统给我们提供了三种补救措施

+(BOOL)resolveInstanceMethod:(SEL)name{

if (name == @selector(addUI)) {

    class_addMethod([self class], name, (IMP)dosomething, "v@:");
    return YES;
}
return [super resolveInstanceMethod:name];

}
可在该类中动态的为SEL 添加方法的实现

(id)forwardingTargetForSelector:(SEL)aSelector{

if (aSelector == @selector(addUI)) {

    return [[People alloc] init];
}
return nil;

}
指定一个备援接受者 可以为该方法指定一个实例对象,让其他对象去实现该方法

(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
这个方法为该方法做一个签名,将该方法参数等一些别的信息包装成为一个Invocation
-(void)forwardInvocation:(NSInvocation *)anInvocation{

if (anInvocation.selector == @selector(addUI)) {

    People *p = [[People alloc] init];

    [anInvocation invokeWithTarget:p];
}

}

runtime方法交换

我们在开发中为数组越界和字典的value为空容易崩溃的问题添加一些防错机制
为NSArray、NSDictionary、NSMutableArray等添加分类在分类的load方法中通过runtime实现方法的交换

image.png

回答到这里又会有个小的知识点

分类添加属性

在分类中添加属性,因为我们声明属性的目的,就是为了在外界中通过getter或setter方法去使用该类中的成员变量的值,因为分类中不能添加成员变量,所以无法生成对应的setter或getter方法,我们可以通过运行时,关联属性,为它添加对应的getter和setter方法

字典转模型

字典转模型中的经典应用就是MJExtension框架 实现方式

通过selector获取对应的IMP

//第一种获取IMP的方法
Method aa = class_getClassMethod(objc_getClass("Test"), @selector(test));

IMP impa = method_getImplementation(aa);

//第二种获取IMP的方法
IMP imp2 = class_getMethodImplementation([Student class], @selector(test));    //获取实例方法的IMP

IMP imp3 = class_getMethodImplementation(objc_getClass("Student"), @selector(test));   //获取类方法的IMP

iOS开发中runtime无处不在,小编觉得如果把这些都掌握了,面试中关于runtime这块应该可以过关

上一篇 下一篇

猜你喜欢

热点阅读