<aside> 🌟
以下是通过极客时间《iOS高级课》中总结的面试题,仅供参考。
</aside>
以下关于 objc_msgSend 和 fishhook 的说法中,哪些是正确的?
A. objc_msgSend 是使用 C 语言编写的
B. objc_msgSend 在运行时根据对象和方法的 selector 找到对应的函数指针,然后执行
C. 可以使用 fishhook 来 hook objc_msgSend
D. fishhook 通过重新绑定符号,实现对 c 方法的 hook
答案:B, D
A 选项,objc_msgSend 是使用汇编语言编写的。
C 选项,hook objc_msgSend 还需要用到汇编。
Auto Layout 的布局工作过程描述,哪些是正确的?
A. Layout Engine 在碰到约束变化后不会重新计算布局
B. Constraints Change 不会触发约束变化
C. Layout Engine 会将视图、约束、优先级、固定大小通过计算转换成最终的大小和位置
D. 在 Layout Engine 里,每当约束发生变化,就会触发 Deffered Layout Pass
答案:C, D
A 选项,Layout Engine 在碰到约束变化后会重新计算布局,获取到布局后调用 superview.setNeedLayout(),然后进入 Deferred Layout Pass。
B 选项,Constraints Change 表示的就是约束变化,添加、删除视图时会触发约束变化。
链接器对代码做的事情,哪些是正确的?
A. 去项目文件里查找目标代码文件里已经定义的变量
B. 扫描项目中的不同文件,将所有符号定义和引用地址收集起来,并放到全局符号表中
C. 计算合并后长度及位置,生成同类型的段进行合并,建立绑定
D. 对项目中不同文件里的变量进行地址重定位
答案:B, C, D
A 选项,查找没有定义的变量。
下面哪些工具可以作为静态分析器?
A. OCLint
B. Infer
C. Injection
D. ImageOptim
答案:A, B
C 选项,Injection 的工具用来动态地将 Swift 或 Objective-C 的代码在已运行的程序中执行,以加快调试速度,同时保证程序不用重启。
D 选项,ImageOptim 是图片压缩工具。
关于减少 App 包大小,哪些说法是正确的?
A. 通过 AppCode 找出无用代码
B. LinkMap 结合 Mach-O 找无用代码
C. 使用 LSUnusedResources 进行图片压缩
D. 使用 App Thining 可以减少包大小
答案:A, B, D
C 选项,LSUnusedResources 是找无用图片的工具,TinyPng 或 ImageOptim 才是图片压缩的工具。
下面哪些问题是信号可捕获的?
A. 内存被打爆
B. NSNotification 线程问题
C. 后台任务超时
D. 野指针
答案:B, D
A 选项和 C 选项是无法通过信号捕获的。
下面哪个异常编码,是表示 App 在一定时间内无响应而被 watchdog 杀掉的?
A. 0xdeadfa11
B. 0xc00010ff
C. 0x8badf00d
D. 0xdead10cc
答案:C
A 选项,表示 App 被用户强制退出。
B 选项,表示 App 因为运行造成设备温度太高而被杀掉。
D 选项,表示死锁,当 App 在后台运行时,持有了系统资源。
导致卡顿的原因,以下说法哪些是正确的?
A. 复杂 UI 、图文混排的绘制量过大
B. 在主线程上使用锁
C. 在主线程做大量的 IO 操作
D. 运算量过大,CPU 持续高占用
答案:A, C, D
B 选项,主线程上使用锁不一定会导致卡顿,死锁和主子线程抢锁才会。
以下哪些方法可以获取内存上限值?
A. 通过 JetsamEvent 日志计算内存限制值
B. 通过 XNU 获取内存限制值
C. 通过内存警告获取内存限制值
D. 通过 hook malloc_logger 函数来获取内存限制值
答案:A, B, C
D 选项,hook malloc_logger 用来定位谁分配的内存。
关于线程,以下哪些说法是正确的?
A. UIKit 是线程安全的
B. UIKit 没有使用多线程技术
C. 常驻线程一直存在于内存中
D. 线程开多了会有内存问题
答案:B, C, D
A 选项,UIKit 不是线程安全的。
以下哪些是可以在 iOS 中使用的 GUI 框架?
A. WebKit
B. Flutter
C. Blink
D. Texture
答案:A, B, D
C 选项,Blink 是谷歌从 WebKit 中 WebCore 拉出的分支,用于 Chrome 中,无法用在 iOS 中。
关于 iOS 开发中使用的开源库,下面哪些说法是正确的?
A. ReactiveCocoa、RxSwift、React.js 都是 iOS 响应式框架
B. Lottie 框架可以解决动画制作与开发隔离,以及多平台统一的问题
C. SkyLab 可以用来作 A/B 测试
D. Promise 可以提高 JSON 解析的性能
答案:B, C
A 选项,React.js 是前端响应式框架。
D 选项,Promise 是一种专门针对异步数据操作编写的一套统一规则的模式,可以用于事件总线的数据订阅和数据发布事件。
iOS 系统可以分为哪几层?
A. 最一层是 Topaz 层
B. 第二层是应用框架层
C. 第三层是微内核层
D. 第四层是 Darwin 层
答案:B, D
A 选项,第一层是用户体验层,主要是提供用户界面。这一层包含了 SpringBoard、Spotlight、Accessibility。Topaz 层是 Fuchsia 的系统基础应用层。
C 选项,第三层是核心框架层,是系统核心功能的框架层。