iOS高级资深工程师面试篇系列 - 已更新3篇
UI部分1/3 -UITableView-事件传递&视图响应
UI部分2/3 -图像显示原理-UI卡顿&掉帧
UI部分3/3 -UIView绘制原理-离屏渲染
技术:iOS底层原理、分类、关联对象、扩展、代理、通知、KVC、KVO、属性关键字
面试过程当中和分类一起考察的是 OC的
扩展
声明私有方法
比如说: 定义一个分类,只把头文件放到对应的宿主文件的.m文件当中,满足了一个私有方法的声明和使用
作用: 对外不暴露分解体积庞大的类文件
比如说: 一个类的功能比较复杂。按照功能来对类的当中一些方法进行分类。把同一功能分类的就放到同一个分类当中把Framework的私有方法公开
关于分类可以做的事情。不止上面三点。如果面试过程中,可以根据自身开发对分类的理解。在基础上进行扩展
特点
分类的特点。
在实际面试过程中。其实就是说明了分类
和扩展
的区别
。
运行时决议
概念: 实际上我们在编写\编好分类文件之后,
系统并没有把分类当中对应添加的内容附加到相应的宿主类上面,
那么这个时候的宿主类还没有对应的方法。
而是在运行时通过runtime运行时,把分类当中添加的内容 添加到最近的宿主那上面。
那么这个是分类的最大的特点
同时也是分类和扩展的最大区别。可以为系统类添加分类
那么无论你现在在哪个公司相信大家应该都接触过关于uiview的一些获取坐标的分类方法
那么实际上的是我们在工程当中植入了分类对应的UI系统的这个文件的一个分类
那么我们对于扩展实际上是不能给系统类添加扩展的
所以说了在这里讲分类的特点实际上也是在讲分类和扩展的区别
- 实例方法
- 类方法
- 协议
- 属性
添加属性的注意点 :
分类当中定义了一个属性,实际上是指声明了对应的get的方法和set的方法
并没有
为我们在分类当中添加了实例变量
所以大家一定要记清楚这一点
在回答面试官问你的问题的时候,不要误以为添加属性
就是添加实例变量
分类
实际上也是可以添加实例变量
的 但是,不是通过定义分类文件直接添加了
而是通过另一种技术叫关联对象
根据苹果官方文档对 Category 的描述,它的使用场景主要有三个:
- 给现有的类添加方法;
- 将一个类的实现拆分成多个独立的源文件;
- 声明私有的方法。
其中,第 1 个是最典型的使用场景,应用最广泛。
注:Category 有一个非常容易误用的场景,那就是用 Category 来覆写父类或主类的方法。虽然目前 Objective-C 是允许这么做的,但是这种使用场景是非常不推荐的。使用 Category 来覆写方法有很多缺点,比如不能覆写 Category 中的方法、无法调用主类中的原始实现等,且很容易造成无法预估的行为。
打开 runtime 源码工程,在文件 objc-runtime-new.mm 中找到以下函数:
找到_read_images
函数进行研究
具体可以参考-分类推荐文章的
5. Category的使用场景、底层结构、Category 和 Class Extension 的区别、objc_msgSend() 方法实现 2020-02-26
- 美团技术团队的深入理解Objective-C:Category 2015-03-03
- sunny的objc category的秘密 2014-03-05
- Edgar’s Blog的iOS 分类扩展与协议总结 2019-07-08
- Category原理解析 2018-07-29
- Category的使用场景、底层结构、Category 和 Class Extension 的区别、objc_msgSend() 方法实现 2020-02-26
初级工程师
通知是NS开头的。苹果没有开放出对应的源码
滴滴公司考点
考察通知实现的逻辑原理
只要回复一个基本的大概原理就行
阿里、腾讯可能会问到 KVO的底层原理是什么
阿里、腾讯公司考点
我们定义属性往往需要内存管理的相关属性,比如retain、copy、assign、weak