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