美团一面
-
自我介绍
(略)
-
切圆角方法
我说了两个,一个是cornerRadius配合maskToBounds的方法,另一个是CAShapeLayer配合UIBerizePath的方法,还对比了两个的优缺点
-
切完后他们的响应区域是怎么样的
还是方形,因为在切的只是layer层,显示层,而不是切事件响应的UIView层
- HitTest的作用
-
HitTest响应过程
-
GCD串行队列中加入很多任务,这些任务会在同一个线程执行吗
我说会,不知道
-
NSOperation有用过吗
没有,但是了解过
-
怎么在GCD中实现NSOpeartion的最大并发数
使用dispatch_semaphore,信号量机制,实现最大并发数的需求
-
GCD还有什么函数
group、notify、barrier
-
怎么使用GCD实现线程安全的属性,他们的getter和setter应该怎么写
创建一个串行队列,然后setter和getter都使用dispatch.sync的方法,利用串行队列的特性,限制读写行为有次序的进行
-
如果我想能并发的读,要做什么修改
改成并发队列,setter改成使用dispatch.barrier.async,实现多读单写
上面这两题52都有提到
- 为什么要重构Model层
- 为什么要重构网络请求框架
-
重构后对项目有什么提升
(略)
-
什么情况下会出现retain cycle
两个对象互相强引用
-
你使用什么方法去排查retain cycle
instruments的leak
-
如果我A中B作为属性被强引用,B中A也作为属性被强引用,怎么避免内存泄漏的问题(不能修改AB的源码)
我想不到,他说手动把A中的B置nil就好了
-
http和https的区别
- http是不安全的,无状态的,https是加密传输,具有身份认证,是安全的
- https需要到ca申请证书,http不用
- http和https使用不同的连接方式,端口也不一样,http是80,https是443
-
https证书的作用
我不是很懂他要问什么,不就是验证服务器身份那些吗
-
https的加密原理
使用两把密钥的公开密钥加密。公开密钥加密使用一对非对称的密钥。一把叫做私钥,另一把叫做公钥。私钥不能让其他任何人知道,而公钥则可以随意发布,任何人都可以获得。使用公钥加密方式,发送密文的一方使用对方的公钥进行加密处理,对方收到被加密的信息后,再使用自己的私钥进行解密。利用这种方式,不需要发送用来解密的私钥,也不必担心密钥被攻击者窃听而盗走。
-
什么是对称加密
就是双方需要同一个密钥进行加密解密
-
有了解过socket吗
了解不多,套接字,基于TCP/IP协议
-
socket的心跳机制
客户端每隔一段时间向服务端发送空数据包,如果数据不能发送就说明socket已经断开了,需要释放资源重新连接,这就是心跳保活
-
TCP的滑动窗口是什么
滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量
-
现在有一个网盘,网盘内部有文件和文件夹,API1可以知道一个节点是文件还是文件夹,API2可以对文件进行下载,怎么显示同步整个网盘内容的需求
我就问是不是一个树状的网盘结构,好像戳到他G点一样很开心,然后我就说用API1使用先序遍历的方式,遇到是文件就调用API2进行下载,不是则递归遍历
-
如果要添加一个同步进度的需求(已下载/全部文件),你会怎么做
那我在下载前先遍历一次,得到总的文件数目,再在下载时更新同步进度
-
为什么使用先序遍历,有什么好处
先序遍历能够很快的知道当前的节点的下一节点究竟是文件还是文件夹,方便快速的进行操作
- 有什么问题问他
有趣,美团问的问题还是有一些难度的,不比其他大厂简单多少
美团二面
-
iOS编译过程发生了什么
一上来就发大招
-
main函数一定是首先调用的吗
我听了半天他的“main”,我还以为他说“load”,真是尴尬死我,然后我说不会
-
iOS内存管理规则
引用计数
-
什么时候会出现循环引用
巴拉巴拉
-
ARC内存管理
一开始我在说autoreleasepool,他打断我说不是说这个,然后我意识到他想说ARC在编码阶段对代码的优化,会自动在代码上面添加
[release]
[autorelease]
标记 -
自动添加代码的原理实现
不会
-
那说一下autoreleasepool
巴拉巴拉
-
什么情况下要自己调用@autoreleasepool
我就说了一个在大循环里面要做耗费内存的操作时要用
-
autorelease的释放时机
autoreleasepool在每一次runloop结尾释放,@autoreleasepool在作用域完释放
-
OC里面块的作用
传值
-
OC块的底层实现
底层团名不虚传,我说是一个函数指针,他追问那为什么不直接用函数指针,我就哑火了
-
OC的消息转发机制
- OC中是怎么通过实例找到它的类的
-
类方法和实例方法在消息转发时有什么区别
不会
- 问项目的架构,什么时候用MVC,什么时候用MVVM
- 问项目怎么重构请求框架
-
问项目怎么实现即时聊天
- HTTP方法列举
- get和post的区别
-
HTTP状态码
很多公司问过了
-
为什么要网络分层
- 各层之间是独立的。某一层并不需要知道它下一层是如何实现的,而仅仅需要知道该层通过层间的接口所提供的服务。由于每一层只实现一种相对独立的功能,因而可以将一个难以处理的复杂问题分解为若干个较容易处理的更小问题,这样,整个问题的复杂度就下降了。
- 灵活性好。当任何一层发生变化时,只要层间接口关系保持不变,则在这层以上或以下各层均不受影响,此外,对某一层提供的服务还可以进行修改。当某层提供的服务不再需要时,甚至可以将这层取消。
- 结构上可分割开。各层都可以采用最合适的技术来实现。
- 易于实现和维护。这种结构使得实现和调试一个庞大而又复杂的系统变得易于处理,因为整个系统已被分解为若干个相对独立的子系统。
- 能促进标准化工作。因为每一层的功能及其所提供的服务都已有了精确的说明。
-
git中merge和rebase有什么区别
-
iOS事件转发和HitTest
一面问过
-
iOS优化策略
巧了我的blog写过
-
算法题:一个100个元素的数组,里面有1-99共99个元素乱序排列,还有一个元素是1-99中的某一个元素,找出这个重复的元素
一开始我想排序,他说不能修改数组,后面我想到直接把整个数组元素的值加起来,然后减去1-99的总和,就能找到重复的元素了
- 大学对你影响最大的三本书
- iOS学习经历
- 平常有什么兴趣爱好
- 平常喜欢看什么电影
- 什么时候能去实习
- 有了解过web开发吗
-
知道一个网页从输入网址到渲染到浏览器上的过程吗
我说不知道,可是我知道DNS地址解析的过程,然后说了一遍
- 有什么问题问他
美团问的技术问题是真的难。。。