分享早期纷享销客的一套面试题,供大家参考。
1、设计模式原则
单一职责、里氏替换原则、依赖倒置原则、接口隔离、开闭原则、迪米特原则
2、urlsession和urlconnection区别
普通任务和上传、下载任务方式、请求方法的控制、断点续传的方式、配置信息的区别。
3、http1.0 2.0区别
- HTTP1.1默认使用长连接,可有效减少TCP的三次握手开销。
- HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。
- HTTP1.0是没有host域的,HTTP1.1才支持这个参数。
- HTTP2.0使用多路复用技术(Multiplexing),多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
- “HTTP1.1在同一时间对于同一个域名的请求数量有限制,超过限制就会阻塞请求”。多路复用底层采用”增加二进制分帧层”的方法,使得不改变原来的语义、首部字段的情况下提高传输性能,降低延迟。二进制分帧将所有传输信息分割为更小的帧,用二进制进行编码,多个请求都在同一个TCP连接上完成,可以承载任意数量的双向数据流。HTTP/2更有效的使用TCP连接,得到性能上的提升。
- * HTTP/2新增首部压缩(Header Compression):采用HPACK算法 * HTTP/2新增服务端推送(Header Compression)
4、http、https握手
- 第一次握手,建立连接时,客户端发送syn包到服务器,并进入SYN_SEND状态,等待服务器确认。 SYN(同步序列编号)
- 第二次握手,服务器收到syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手,客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
- 完成三次握手,客户端与服务器开始传送数据。
- 第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态
- 第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
- 第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)
- 第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态
5、json xml区别
- (1).可读性方面。JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。
- (2).可扩展性方面。XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
- (3).编码难度方面。XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
- (4).解码难度方面。XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
- (5).流行度方面。XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
- (6).解析手段方面。JSON和XML同样拥有丰富的解析手段。
- (7).数据体积方面。JSON相对于XML来讲,数据的体积小,传递的速度更快些。
- (8).数据交互方面。JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
- (9).数据描述方面。JSON对数据的描述性比XML较差。
- (10).传输速度方面。JSON的速度要远远快于XML。
6、AFN数据处理区别,文件上传时content type
multipart/form-data
7、contentType类型有哪些?
application/x-www-form-urlencoded、multipart/form-data、application/json
8、为什么block会循环引用?
9、block传值原理
10、方法转发,替换,覆盖,注意什么?
为了保证方法替换执行一次,我们通常会加上dispatch_once,否则当执行偶数次替换的时候,方法替换失效在子类没有实现父类方法,子类中替换父类方法的时候;我们用父类调用方法的时候会闪退
class_addMethod尝试向类添加需要替换的原方法originalMethod,添加的方法的实现是replacementMethod的实现;如果添加成功,表示类没有实现originalMethod,这时候class_replaceMethod再将replacementMethod实现改为originalMethod的实现,就达到了替换的效果;如果添加失败,就直接method_exchangeImplementations替换两个方法的实现即可。
dispatch_once+load保证替换执行一次load保证在继承关系中替换时,按照继承链来替换方法替换时检查类中是否实现了原方法,避免子类中没有实现,替换子类的方法时,将父类的方法替换了。
11、组件化是什么,项目如何拆分?
12、按行打印二叉树
public class Tree { TreeNode last; TreeNode nlast; public void printTree(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); last = root; nlast = root; while (!queue.isEmpty()) { TreeNode t = queue.peek(); System.out.print(queue.poll().data + " "); if (t.left != null) { queue.add(t.left); nlast = t.left; } if (t.right != null) { queue.add(t.right); nlast = t.right; } // 如果当前输出结点是最右结点,那么换行 if (last == t) { System.out.println(); last = nlast; } } }
13、私有库如何通信
14、tableview scrollview嵌套时,手势冲突如何处理
15、cell卡顿原因,圆角处理方式
16、weak实现原理
17、dealloc都做什么事
- 首先调用 _objc_rootDealloc()
- 接下来调用 rootDealloc()
- isTaggedPointer 是否是标记指针 是直接 return ;
接下来会判断是否可以被直接快速释放,判断的依据主要有 5 个,判断是否有以下五种情况
nonpointer 是否优化过isa指针
weakly_reference 是否存在弱引用指向
has_assoc 是否设置过关联对象
has_cxx_dtor 是否有cpp的析构函数(.cxx_destruct)
has_sidetable_rc 引用计数器是否过大无法存储在isa中
如果有以上五种任意一种,将会调用 object_dispose()方法,做下一步的处理。
如果没有之前五种情况的任意一种,则可以执行释放操作,C 函数的 free()。 - 执行完毕。
18、class初始化过程
19、git merge rebase区别
20、分类添加属性原理
21、界面实时刷新原理
23、架构理解情况
24、说说自己优点缺点,管理风格