【iOS高级资深工程师面试篇】②、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 Objective-C语言特性部分1/2 分类-关联对象-扩展-代理

iOS高级资深工程师面试篇系列 - 已更新3篇
UI部分1/3 -UITableView-事件传递&视图响应
UI部分2/3 -图像显示原理-UI卡顿&掉帧
UI部分3/3 -UIView绘制原理-离屏渲染

技术:iOS底层原理、分类、关联对象、扩展、代理、通知、KVC、KVO、属性关键字

《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/)
          • ❓面试考点: 1. 什么是分类,2.分类的实现机制/原理是怎样的,3.能否给分类添加实例变量(关联对象添加的技术), 4分类和扩展的区别是什么
          • 1. 面试题 - 你用分类都做了哪些事
            • 1.1 分类的`特点`
          • 2. 面试题 - 分类都可以添加哪些内容?
          • 1. 面试题 - 你用分类都做了哪些事情
        • 自身知识的延伸(本文章不扩展来讲) - 分类的使用场景、分类源码底层原理-objc4(runtime->objc-runtime-new.mm)
          • 分类的使用场景
          • 开源源码 : iOS底层原理 - [[分类源码可以查看苹果的-objc4-runtime源码]](https://opensource.apple.com/tarballs/objc4/)
          • 分类-推荐文章
        • 二、关联对象 - 可以查看苹果关联对象的源码
        • 三、[扩展](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html)
        • 四、代理 - 针对`初级工程师`
        • 五、通知
          • ❓面试考点: 1. 通知的实现机制/原理是怎样的 `滴滴公司考点`
        • 六、KVO
          • ❓面试考点: 1. KVO的实现机制是怎样,并且我们实际开发中使用KVO监听一些内容 `阿里、腾讯公司考点`
        • 七、KVC
          • ❓面试考点: 1. KVC的是一个怎样的原理呢?
        • 八、属性关键字
          • ❓面试考点: 1.weak和assign有什么区别呢? 2.我们怎么使用copy关键字?

一、分类 - 可以查看分类源码可以查看苹果的-objc4-runtime源码
❓面试考点: 1. 什么是分类,2.分类的实现机制/原理是怎样的,3.能否给分类添加实例变量(关联对象添加的技术), 4分类和扩展的区别是什么

面试过程当中和分类一起考察的是 OC的扩展

1. 面试题 - 你用分类都做了哪些事
  1. 声明私有方法
    比如说: 定义一个分类,只把头文件放到对应的宿主文件的.m文件当中,满足了一个私有方法的声明和使用
    作用: 对外不暴露
  2. 分解体积庞大的类文件
    比如说: 一个类的功能比较复杂。按照功能来对类的当中一些方法进行分类。把同一功能分类的就放到同一个分类当中
  3. 把Framework的私有方法公开
    关于分类可以做的事情。不止上面三点。如果面试过程中,可以根据自身开发对分类的理解。在基础上进行扩展
1.1 分类的特点

分类的特点。
在实际面试过程中。其实就是说明了分类扩展区别

  1. 运行时决议
    概念: 实际上我们在编写\编好分类文件之后,
    系统并没有把分类当中对应添加的内容附加到相应的宿主类上面,
    那么这个时候的宿主类还没有对应的方法。
    而是在运行时通过runtime运行时,把分类当中添加的内容 添加到最近的宿主那上面。
    那么这个是分类的最大的特点
    同时也是分类和扩展的最大区别。
  2. 可以为系统类添加分类
    那么无论你现在在哪个公司相信大家应该都接触过关于uiview的一些获取坐标的分类方法
    那么实际上的是我们在工程当中植入了分类对应的UI系统的这个文件的一个分类
    那么我们对于扩展实际上是不能给系统类添加扩展的
    所以说了在这里讲分类的特点实际上也是在讲分类和扩展的区别
2. 面试题 - 分类都可以添加哪些内容?
  1. 实例方法
  2. 类方法
  3. 协议
  4. 属性
    添加属性的注意点 :
    分类当中定义了一个属性,实际上是指声明了对应的get的方法和set的方法
    没有为我们在分类当中添加了实例变量 所以大家一定要记清楚这一点
    在回答面试官问你的问题的时候,不要误以为添加属性 就是添加实例变量
    分类实际上也是可以添加实例变量的 但是,不是通过定义分类文件直接添加了
    而是通过另一种技术叫关联对象
1. 面试题 - 你用分类都做了哪些事情
自身知识的延伸(本文章不扩展来讲) - 分类的使用场景、分类源码底层原理-objc4(runtime->objc-runtime-new.mm)
分类的使用场景

根据苹果官方文档对 Category 的描述,它的使用场景主要有三个:

  1. 给现有的类添加方法;
  2. 将一个类的实现拆分成多个独立的源文件;
  3. 声明私有的方法。
    其中,第 1 个是最典型的使用场景,应用最广泛。
    注:Category 有一个非常容易误用的场景,那就是用 Category 来覆写父类或主类的方法。虽然目前 Objective-C 是允许这么做的,但是这种使用场景是非常不推荐的。使用 Category 来覆写方法有很多缺点,比如不能覆写 Category 中的方法、无法调用主类中的原始实现等,且很容易造成无法预估的行为。
开源源码 : iOS底层原理 - [分类源码可以查看苹果的-objc4-runtime源码]

打开 runtime 源码工程,在文件 objc-runtime-new.mm 中找到以下函数:
找到 _read_images 函数进行研究
【iOS高级资深工程师面试篇】②、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 Objective-C语言特性部分1/2 分类-关联对象-扩展-代理_第1张图片
具体可以参考-分类推荐文章的
5. Category的使用场景、底层结构、Category 和 Class Extension 的区别、objc_msgSend() 方法实现 2020-02-26

分类-推荐文章
  1. 美团技术团队的深入理解Objective-C:Category 2015-03-03
  2. sunny的objc category的秘密 2014-03-05
  3. Edgar’s Blog的iOS 分类扩展与协议总结 2019-07-08
  4. Category原理解析 2018-07-29
  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


你可能感兴趣的:(#,iOS-笔试题&面试题,ios高级资深工程师面试总结,iOS高级资深工程师,分类,扩展,代理)