iOS面试之Runtime大全

Runtime内容如下:

  • 数据结构
  • 类对象与元类对象
  • 消息传递
  • 方法缓存
  • 消息转发
  • Method-Swizzling
  • 动态添加方法
  • 动态方法解析
image

1.数据结构

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

推荐阅读

iOS开发——最新 BAT面试题合集(持续更新中)

- objc_object
- objc_class
- isa指针
- method_t

  • objc_object

    image
id = objc_object

  • objc_class

    image
- class 等同于 objc_class
- objc_class继承于objc_object
- objc_class 包含 superClass,cache,bits.

  • isa指针
image
- 指针型isa
isa的值代表Class的地址

- 非指针型isa
isa的值得部分代表Class的地址

思考-面试题:isa的含义?

image
isa指向:
- 关于对象,其指向类对象

image
关于元类,其指向元类对象

  • cache_t
- 用于快速查找方法执行函数
- 增量扩展的哈希表结构
- 局部性原理的应用

image
- 理解一个数组来实现
- 数组每一个对象都是bucket_t结构体封装
- bucket_t两个成员变量key ,IMP
- key对应OC selector
- IMP理解为无类型的函数指针

  • class_data_bits_t
- 对class_rw_t的封装
- class_rw_t代表了类相关的读写信息,对calss_ro_t的封装
- class_ro_t代表了类相关的只读信息

image
- class_rw_t
- 包括class_ro_t,protocols,properties,methods
- protocols,properties,methods,是一个二维数组

image
- class_ro_t
- 包括name,ivars,properties,protocols,methodList
- ivars,,properties,protocols,methodList对应一维数组

  • method_t
- 函数四要素
名称
返回值
参数
函数体

- method_t
- SEL name; //函数名
- const char* types; 返回值类型及参数类型
- IMP imp; //无返回值的函数体

-(void)method; == v@:
v->void
@->id
:->SEL

  • 整体数据结构

    image

2.类对象与元类对象

image
- 类对象存储实例方法列表等信息
- 元类对象存储类方法列表等信息

思考-面试题
#import "Food.h"
@interface Beef : Food
@end
---------------------------------
@implementation Beef
-(id)init{
     self = [super init];
     if(self){
       NSLog(@"%@",NSStringFromClass([self class]));
       NSLog(@"%@",NSStringFromClass([super class]));
    }
    return self;
}

3.消息传递

void objc_msgSend

image
void objc_msgSendSuper

image
消息传递过程

image
缓存查找

image
当前类中查找
对于已排序好的列表,采用二分查找算法查找方法对应执行函数
对于没有排序的列表,采用一般遍历查找方法对应执行函数

父类逐级查找

image

4.消息转发

image

5.Method-Swizzling

image
方法交换

6.动态添加方法

void test1 (void)
{
    NSLog(@"test1");
}

+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        NSLog(@"resolveInstanceMethod:");
        // 动态添加test方法的实现
        class_addMethod(self, @selector(test), test1, "v@:");
        return YES;
    }
    else{
        // 返回父类的默认调用
        return [super resolveInstanceMethod:sel];
    }
}

7.动态方法解析

动态运行时语言将函数决议推迟到运行时

8.面试

  • [obj eat] 和objc_msgSend()函数之间有什么关系?
  • runtime如何通过Selector找到对应的IMP地址的?
  • 能否在编译后的类中增加实例变量?

文章来源于网络,如有侵权,请联系小编删除。

推荐阅读更多精彩内容

  • 本文转载自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex阅读 337评论 0 1
  • 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的...
    lylaut阅读 424评论 0 2
  • 文中的实验代码我放在了这个项目中。 以下内容是我通过整理[这篇博客] (http://yulingtianxia....
    茗涙阅读 272评论 0 4
  • 引言 曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Ob...
    奋拓达阅读 218评论 0 6
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 254评论 0 2