近期公司业务扩大,小组又增加了两个岗位名额,整理出一点基础且实用的面试题,更高效的在面试中筛查合适的人选。
https://www.jianshu.com/p/d884f3040fda
https://www.jianshu.com/p/a70841d17fb2
runtime相关
https://www.jianshu.com/p/3ec2f56f3679
初级:
1、描述一种在Swift中出现循环引用的情况,并说明怎么解决。
循环引用出现在当两个实例对象相互拥有强引用关系的时候,这会造成内存泄露,原因是这两个对象都不会被释放。只要一个对象被另一个对象强引用,
那么该对象就不能被释放,由于强引用的存在,每个对象都会保持对方的存在。
解决方式:用weak或者unowned引用代替其中一个的强引用,来打破循环引用。
2、代码设计模式、架构模式、框架
单例 ,
工厂,
观察者模式 :通知、KVO
架构模式
MVC MVVM MVP
3、frame 和 bounds 有什么不同?
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父view的坐标系统)
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是屏幕坐标系统)
4、Category(类别)、 Extension(扩展)和继承的区别
区别:
1. 分类有名字,类扩展没有分类名字,是一种特殊的分类。
2. 分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法。
3. 继承可以增加,修改或者删除方法,并且可以增加属性。
5、ViewController生命周期
按照执行顺序排列:
1. initWithCoder:通过nib文件初始化时触发。
2. awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。
3. loadView:开始加载视图控制器自带的view。
4. viewDidLoad:视图控制器的view被加载完成。
5. viewWillAppear:视图控制器的view将要显示在window上。
6. updateViewConstraints:视图控制器的view开始更新AutoLayout约束。
7. viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。
8. viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。
9. viewDidAppear:视图控制器的view已经展示到window上。
10. viewWillDisappear:视图控制器的view将要从window上消失。
11. viewDidDisappear:视图控制器的view已经从window上消失。
6、你一般是怎么用Instruments的?
Instruments里面工具很多,常用:
product -> profile ->
1). Time Profiler: 性能分析
2). Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能。
3). Allocations:用来检查内存,写算法的那批人也用这个来检查。
4). Leaks:检查内存,看是否有内存泄露。
7、在Swift中,什么时候用结构体,什么时候用类?
在Swift中,类和结构体有许多不同的特性。下面是两者不同的总结:
类支持继承,结构体不支持。
类是引用类型,结构体是值类型
并没有通用的规则决定结构体和类哪一个更好用。一般的建议是使用最小的工具来完成你的目标,但是有一个好的经验是多使用结构体,除非你用了继承和引用语义。
注意:在运行时,结构体在性能方面更优于类,原因是结构体的方法调用是静态绑定,而类的方法调用是动态实现的。这就是尽可能得使用结构体代替类的又一个好的原因。
8、在swift中?的含义是什么
guard 使用场景
引发 swift 可选类型
https://www.jianshu.com/p/448cf4f8cf65
9、Swift 高阶函数
map、filter、reduce 的作用
map 用于映射, 可以将一个列表转换为另一个列表
filter 用于过滤, 可以筛选出想要的元素
reduce 合并
map 与 flatmap 的区别
swift4新特性 compactMap 替代了 flatmap
10、什么时候使用 @objc
@objc 用途是为了在 Objective-C 和 Swift 混编的时候, 能够正常调用 Swift 代码. 可以用于修饰类, 协议, 方法, 属性.
常用的地方是在定义 delegate 协议中, 会将协议中的部分方法声明为可选方法, 需要用到@objc
自己想到的,在实际开发业务时可能用到的一些面试题:
回传值一般喜欢用 闭包还是代理 通知
页面网络加载的时候跳转到其他界面怎么处理
友盟出现错误日志,但是没有具体到页面,怎么处理
设计封装组件化功能模块在完成功能的同时,优先考虑什么方向优化
如何优化代码
页面有多个scrollView时,如何手势不冲突