Swift 面试题
本文整理了 Swift 开发面试中常见的问题与解答,帮助开发者巩固基础知识,顺利通过技术面试。
前提
- git 使用
- 三方库使用
- swift 调用oc
- 解决问题方式
frame 和 bounds 有什么不同?
1 | frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父view的坐标系统) |
ViewController生命周期
按照执行顺序排列:
- initWithCoder:通过nib文件初始化时触发。
- awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。
- loadView:开始加载视图控制器自带的view。
- viewDidLoad:视图控制器的view被加载完成。
- viewWillAppear:视图控制器的view将要显示在window上。
- updateViewConstraints:视图控制器的view开始更新AutoLayout约束。
- viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。
- viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。
- viewDidAppear:视图控制器的view已经展示到window上。
- viewWillDisappear:视图控制器的view将要从window上消失。
- viewDidDisappear:视图控制器的view已经从window上消失。
开发项目时你是怎么检查内存泄露?
- 静态分析 analyze。
- instruments工具里面有个leak可以动态分析。
如何解决引用循环
- 转换为值类型, 只有类会存在引用循环, 所以如果能不用类, 是可以解引用循环的,
- delegate 使用 weak 属性.
- 闭包中 如果确认一定不为nil,[unowned self] 修饰,否则使用 [weak self] 修饰
- 少用单例,减少内存占用
- 闭包内不要调用外部局部变量,应该使用weak修饰后调用,或者[weak self] 调用
delegate 和 notification 的区别
- 二者都用于传递消息,不同之处主要在于一个是一对一的,另一个是一对多的。
- notification通过维护一个array,实现一对多消息的转发。
- delegate需要两者之间必须建立联系,不然没法调用代理的方法;notification不需要两者之间有联系。
不用中间变量,用两种方法交换A和B的值
1 | // 1.中间变量 |
排序算法 选择排序、冒泡排序、插入排序三种排序算法
1 | /** |
描述一种在Swift中出现循环引用的情况,并说明怎么解决。
- 循环引用出现在当两个实例对象相互拥有强引用关系的时候,这会造成内存泄露,原因是这两个对象都不会被释放。只要一个对象被另一个对象强引用,那么该对象就不能被释放,由于强引用的存在,每个对象都会保持对方的存在。
- 解决方式:用
weak或者unowned引用代替其中一个的强引用,来打破循环引用。
class 和 struct 的区别
class 为类, struct 为结构体, 类是引用类型, 结构体为值类型, 结构体不可以继承
不通过继承,代码复用(共享)的方式有哪些
扩展, 全局函数
map、filter、reduce 的作用
1 | (0 ..< 10).filter{$0 % 2 == 0}.map{"\($0)"}.reduce(""){$0 + $1} |
try, try? 和 try! 的区别
- try 需要 do catch
- try? 在用于处理可抛出异常函数时, 如果函数抛出异常, 则返回 nil, 否则返回函数返回值的可选值
- try! 在函数抛出异常的时候崩溃, 否则则返会函数返回值
protocol associatedtype & typealias & optional function
1 | protocol ListProtcol { |
如何在枚举中定义不同类型的枚举值,并使用
1 | enum Custom { |
lazy 的作用
懒加载, 当属性要使用的时候, 才去完成初始化
下面的代码都用了哪些语法糖
[1, 2, 3].map{ $0 * 2 }
- [1, 2, 3] 使用了 Array 实现的ExpressibleByArrayLiteral 协议, 用于接收数组的字面值
- map{xxx} 使用了尾随闭包(trailing closure)
- 闭包没有声明函数参数, 返回值类型, 数量, 依靠的是闭包类型的自动推断
- 闭包中语句只有一句时, 自动将这一句的结果作为返回值
- $0 在没有声明参数列表的时候, 第一个参数名称为0, 后续参数以此类推
一个类型表示选项,可以同时表示有几个选项选中,用什么类型表示
1 | struct SomeOption: OptionSet { |
定义静态方法时关键字 static 和 class 有什么区别
static 定义的方法不可以被子类继承, class 则可以
如何使用自定义的符号进行条件编译
1 | #if CUSTOM_FLAG |
在Build Settings->Swift Compiler - Custom Flags->Other Swift Flags, add -D CUSTOM_FLAG
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Jerome Xiong!
评论

