1. 面试问题整理
1.1. 面向对象
1.1.1. 面向对象编程特征有哪些?
- “抽象”,把现实世界中的某一类东西,提取出来,用程序代码表示;
- “封装”,把过程和数据包围起来,对数据的访问只能通过已定义的界面;
- “继承”,一种联结类的层次模型;
- “多态”,允许不同类的对象对同一消息做出响应。
1.2. 语言特性
1.2.1. OC和Swift如何互相调用?
1.2.2. struct和class的区别?
https://juejin.cn/post/6844903799413276685
- 类属于引用类型,结构体属于值类型
- 类允许被继承,结构体不允许被继承
- 类中的每一个成员变量都必须被初始化,否则编译器会报错,而结构体不需要,编译器会自动帮我们生成init函数,给变量赋一个默认值
1.2.3. Swift设置访问权限如何设置?
https://juejin.cn/post/7012087397765054494
- open
- public
- internal
- fileprivate
- private
1.2.4. Swift中的逃逸闭包(@escaping )与非逃逸闭包(@noescaping)
https://juejin.cn/post/6844903951519727629
概念:一个接受闭包作为参数的函数,该闭包可能在函数返回后才被调用,也就是说这个闭包逃离了函数的作用域,这种闭包称为逃逸闭包。当你声明一个接受闭包作为形式参数的函数时,你可以在形式参数前写@escaping来明确闭包是允许逃逸。
概念:一个接受闭包作为参数的函数, 闭包是在这个函数结束前内被调用。
1.3. 设计模式
1.3.1. 常见设计模式有哪些?
https://www.cnblogs.com/newsouls/archive/2011/07/28/DesignTemplage.html
- 单例模式
- 工厂模式
1.4. 多线程
1.4.1. 如何用GCD同步若干个异步调用?
https://cloud.tencent.com/developer/article/1521135
- 将几个线程加入到group中, 然后利用group_notify来执行最后要做的动作
- 利用GCD信号量dispatch_semaphore_t来实现
1.4.2. 创建线程有几种方式?
- pthread 实现多线程操作
- NSThread实现多线程
- GCD 实现多线程
- NSOperation
1.5. 运行时
1.5.1. KVO的底层实现?
http://chuquan.me/2018/12/12/kvo-principle/
1.6. 内存管理
1.6.1. 对象在什么时候释放?
https://youle.zhipin.com/questions/4c09e5e18447d9dbtnV809W7FlQ~.html
引用计数小于1的时候释放的。在ARC环境下我们不能直接去操作引用计数的值,但是我们可以跟踪是否有strong指针指向、如果没有strong指针指向、则立即销毁。 这里有一个地方值得关注的事自动缓存池,他会延迟销毁时机,但是实际上也是延迟执行re lease而已。