iOS 面试汇总 - Runtime

Runtime是什么

  • Runtime是属于OC的底层,是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API,可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)。
  • Runtime的核心即为消息机制,在程序运行时动态发送消息。

消息传递过程

  • 首先,通过 obj 的 isa 指针找到它的 class;
  • 注册方法编号;
  • 根据方法编号去方法列表里查找对应的方法函数实现地址;
  • 如果该类中没找到,继续往它的 superclass 中找;
  • 一旦找到对应的函数,就根据地址去方法区调用对应函数实现IMP;
  • 如果没有找到对应的方法实现,OC的运行时会给三个拯救机会;
// 1.拯救实例方法
+ (BOOL)resolveInstanceMethod:(SEL)sel {
    return [super resolveInstanceMethod:sel];    
}


// 2.如果上一个方法返回 NO ,运行时就会移到下一步:
// 消息转发
- (id)forwardingTargetForSelector:(SEL)aSelector {    
    return [super forwardingTargetForSelector:aSelector];
}


// 3.如果上一个方法还是没有实现,那还有最后一次拯救机会:
// 3.1.首先它会发送该消息获得函数的参数和返回值类型。
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    
    NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
    return signature;
}

// 3.2.如果上一个方法返回 nil ,Runtime 则会发出该方法,程序这时也就挂掉了。
- (void)doesNotRecognizeSelector:(SEL)aSelector {
    
}

// 3.3.如果返回了一个函数签名,Runtime 就会发出该方法。
- (void)forwardInvocation:(NSInvocation *)anInvocation {
    
}

常用Runtime函数

  • 头文件 :

  • 发送消息:objc_msgSend(class, sel)
  • 获取一个SEL的方法:
    sel_registerName("alloc")
    @selector(alloc)
  • 获取类:objc_getClass("NSObject")
  • 获取类方法:class_getClassMethod(Class cls , SEL name)
  • 获取对象方法:class_getInstanceMethod(Class cls , SEL name)
  • 交换两个方法:method_exchangeImplementations(method1, method2);
  • 增加方法:class_addMethod(self, sel, (IMP)method1, "v@");
  • 替换原方法实现:class_replaceMethod(Class cls, SEL name, imp, type)
  • 增加属性(setter):objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  • 获取属性():objc_getAssociatedObject(self, @"name")
  • 获取成员变量列表:class_copyIvarList(self, &count)
  • 获取属性列表:class_copyPropertyList(self, &count)
  • 获取方法列表:class_copyMethodList(self, &count)
  • 获取协议列表:class_copyProtocolList(self, &count)

参考文章链接:

http://tech.glowing.com/cn/objective-c-runtime/
http://blog.csdn.net/coyote1994/article/details/52355026

demo链接:

https://github.com/liuleiai1/Runtime_Demo/tree/master

你可能感兴趣的:(iOS 面试汇总 - Runtime)