最近去面试了4家公司(1-3年iOS岗位),简单记录一下被问到的问题
1、SDWebImage的基本原理流程(涉及到图片的存储,下载管理和删除这几个方面的流程)
2、MJRefresh的原理(Runtime+KVO,contentoffset和contentInset)
3、UITableView的优化(我分别从cell和tableView两个角度回答)
4、已知2个view,如何找到他们的共同父view(模仿选择排序?)
5、NSTimer能否放到子线程,如何让NSTimer更准确(面试官说应该把timer放在单独子线程上,主线程可能会有阻塞导致计时不准,这里又可能会被问到线程和runloop的关系)
6、CALayer的渲染过程,离谱渲染的导致原因
7、NSUserdefaults原理(这个我不懂,问:如果让你自己写一个类似的功能,你打算怎么实现)
8、数据持久化(各种方法的优缺点)
- plist文件(属性列表)
- preference(偏好设置)
- NSKeyedArchiver(归档)
- SQLite 3
- CoreData
9、CoreData、SQLite使用
10、weak关键字(把指针置为nil的过程)
11、内存管理机制,autorelease的原理(可以结合Runloop一起回答)
12、OC的消息转发机制(结合OC对象结构一起回答?)
13、Runloop的基本原理
14、Runtime的基本原理,Swizzle Method
15、SEL和Method的关系
16、HTTP的GET/POST请求的区别,三(四)次握手;HTTP/HTTPS的区别
17、TCP/UDP区别,使用场景
18、Scoket的原理和作用
19、instruments 工具的使用
20、各种基础数据结构、通用算法(排序居多,有的还会问到排序用到的数学原理)
21、多线程(会问到thread和runloop的关系,GCD和NSOpertaionQueue的关系(后者是前者的高级抽像))
22、.DSYM文件有什么用(存储了16进制的函数地址映射)
我们在分析Crash前需要将这些十六进制地址转化成方法名称和行数,改过程被称为符号化。
符号化Crash日志需要获取对应的应用二进制文件以及生成二进制文件时产生的 .dSYM 文件(符号表)。必需完全匹配才行。否则,日志将无法被完全符号化。
Xcode编译项目后,会得到同名的 dSYM 文件(符号表),dSYM 文件(符号表)是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的 dSYM 文件,位于 /Users/<用户名>/Library/Developer/Xcode/Archives 目录下,对于每一个发布版本我们都很有必要保存对应的 Archives 文件。
参考文章