好未来面试题
1. 一面
1、说一下optional。?! ?? 是什么意思?有几种解包方式?
解包方式:if let、guard、!强制解包、?? 等。
?!
?? let a = b ?? c
如果b不为nil,则a = b;否则a = c;
2、说一下闭包。
闭包是能够读取其他函数内部变量的函数,可以理解成定义在一个函数内部的函数。
可以用typealias起别名
1 | typealias testBlock = (String) -> Void |
值捕获
闭包可以捕获上下文中的常量和变量
逃逸闭包
当一个闭包作为参数传入函数中,这个闭包需要等函数执行结束返回后执行,这种情况就称作这个闭包在函数中逃逸。在涉及异步操作时经常用到,特别是网络请求后要进行请求成功后的回调时,闭包就要逃逸掉,这时就要在闭包形参前加上@escaping
关键字。
3、比较代理、通知、KVO?这三个谁的效率最高,谁的效率最低?
KVO 效率最低,因为使用到了 Runtime。
代理效率最高,因为是一对一。
4、NSString 和 String 的区别?
String 是值类型,NSString 是引用类型。
5、Swift 跟 OC 的区别?OC 是面向对象的,Swift 呢?(面向对象、面向协议、响应式编程)解释一下面向协议编程?
OC 是动态的语言,Swift 是静态的语言。
6、说一下 MRC ?自动释放池?自动释放池什么时候释放?
iOS 在主线程的Runloop中注册了2个Observer
第1个Observer监听了kCFRunLoopEntry事件,会调用objc_autoreleasePoolPush()
第2个Observer
监听了kCFRunLoopBeforeWaiting事件,会调用objc_autoreleasePoolPop()、objc_autoreleasePoolPush()
监听了kCFRunLoopBeforeExit事件,会调用objc_autoreleasePoolPop()
7、说一下多线程?
NSThread
NSOperation
GCD
8、分别用 OC 和 Swift 手写一下单例。
单例模式在创建过程中,要保证实例变量只被创建一次。在整个开发中需要特别注意线程安全,即使在多线程情况下,依然只初始化一次变量。
1 | + (instanceType)sharedManager { |
在 Swift 中,let 关键字已经保证了实例变量不会被修改,所以单例的创建就简单很多:1
2
3
4class Manager {
static let shared = Manager();
private init() {}
}
9、SnaptKit 内部看过吗?
10、链式语法的实现。
UIView.top.equalTo().offSet(10)
UIView.left.equalTo().offSet(10)
为什么能写成UIView.top.left.offSet(10) ?
block 返回 self 自身,例如:
1 | // 当前类是ViewController类 block 返回类对象 类对象就可以继续调用 test 方法了 |
调用的时候就可以这样写:
1 | self.test(1).test(2).test(3); |
链条的执行顺序
- self 调用 test 方法 test 方法返回 block
- block 得到小括号中的参数 并执行 block 中的代码
- block 返回对象 对象接着调用 test 方法 实际应用中 test 可以是任何这种格式的方法
2. 二面
主要是手写算法题:
1、用两个栈实现队列。
1 | var inStack = []; |
2、从扑克牌中抽出5张,写一个方法判断是不是顺子。(如34567)大小王是万能的,可以替代任意数字。
1 | var isStraight = function(nums) { |
3. 三面
项目经理聊项目
4. 四面
HR问了很多问题,包括个人优缺点,闲暇时间会做什么,在前公司3年的成长等等。