好未来面试题及答案

好未来面试题及答案

好未来面试题

1. 一面

1、说一下optional。?! ?? 是什么意思?有几种解包方式?

解包方式:if let、guard、!强制解包、?? 等。

?!

?? let a = b ?? c 如果b不为nil,则a = b;否则a = c;

2、说一下闭包。

闭包是能够读取其他函数内部变量的函数,可以理解成定义在一个函数内部的函数。

可以用typealias起别名

1
2
3
4
typealias testBlock = (String) -> Void
let aaa: testBlock = {str in
print(str)
}

值捕获

闭包可以捕获上下文中的常量和变量

逃逸闭包

当一个闭包作为参数传入函数中,这个闭包需要等函数执行结束返回后执行,这种情况就称作这个闭包在函数中逃逸。在涉及异步操作时经常用到,特别是网络请求后要进行请求成功后的回调时,闭包就要逃逸掉,这时就要在闭包形参前加上@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
2
3
4
5
6
7
8
+ (instanceType)sharedManager {
static Manager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[Manager alloc] init];
});
return sharedManager;
}

在 Swift 中,let 关键字已经保证了实例变量不会被修改,所以单例的创建就简单很多:

1
2
3
4
class 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
2
3
4
5
6
7
8
9
// 当前类是ViewController类 block 返回类对象 类对象就可以继续调用 test 方法了
- (ViewController *(^)(int))test{

ViewController *(^block)(int i) = ^ViewController *(int i){
NSLog(@"%d",i);
return self;
};
return block;
}

调用的时候就可以这样写:

1
self.test(1).test(2).test(3);
链条的执行顺序
  1. self 调用 test 方法 test 方法返回 block
  2. block 得到小括号中的参数 并执行 block 中的代码
  3. block 返回对象 对象接着调用 test 方法 实际应用中 test 可以是任何这种格式的方法

OC中链式语法的使用及原理

2. 二面

主要是手写算法题:

1、用两个栈实现队列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var inStack = [];
var outStack = [];
function push(node)
{
inStack.push(node);
}
function pop()
{
if (outStack.length == 0) {
while(inStack.length != 0) {
outStack.push(inStack.pop());
}
}
return outStack.pop();
}

2、从扑克牌中抽出5张,写一个方法判断是不是顺子。(如34567)大小王是万能的,可以替代任意数字。

剑指 Offer 61. 扑克牌中的顺子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var isStraight = function(nums) {
let repeat = new Set();
let max = 0, min = 14;
for (let i = 0; i < nums.length; i++) {
if (nums[i] == 0) continue; // 跳过大小王
max = Math.max(max, nums[i]); // 最大牌
min = Math.min(min, nums[i]); // 最小牌
if (repeat.has(nums[i])) {
return false;
}
repeat.add(nums[i]);
}
return max - min < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
};

3. 三面

项目经理聊项目

4. 四面

HR问了很多问题,包括个人优缺点,闲暇时间会做什么,在前公司3年的成长等等。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×