如何面试一个1-3年的 iOS 程序员(持续更新)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何面试一个1-3年的 iOS 程序员(持续更新)相关的知识,希望对你有一定的参考价值。
如何面试一个1-3年的 iOS 程序员(持续更新)
计算机基础类
- 请说一说 HTTP 1.0 和 1.1之间的区别(懵逼题)
这是一道计算机类别的题, 具体区别可以单独写一篇博客了, 但是一般情况下, 最主要的区别还是指1.1中支持长连接. 1.0规定的是浏览器只能与服务器保持短连接, 浏览器的每次请求都需要跟服务器建立一次 TCP 连接, 请求处理完以后就立即断开 TCP 连接, 服务器不跟踪每个客户也不记录过去的请求. 具体可以看这篇博客 - 请说一说长连接和短连接的区别
这个和面试官讨论了一下, 他坚持问的就是长连接, 短连接. 不是什么 HTTP 长连接短连接, 也不是 TCP 的长连接短连接, 最后他说区别都是长连接在断开的和连接的时候都会有一个应答的过程. 求同存异, 这里顺便把 HTTP 长连接短连接的区别以及 TCP 长连接短连接贴出来, 地址 - 请说一说 TCP 和 UDP 的区别
这个的话, 就是一个比较基础的题目了, 感觉这种问题一般顶多出现在笔试过程中, 答案也比较简单, 这里就不占版面了. - 关于 TCP和 UDP 的一些其他问题
传输大文件用哪个连接, 安全的是哪个连接等等, 这些问题都比较简单, 就不再一一赘述
UI 基础题
- 第一个是万年常见题目: 说一下你是如何优化 tableView 的...
这个问题... 常年流窜于各个公司的面试, 笔试中, 网上也有一份从25个方面来优化 tableview 的答案, 但是这个题目的陷阱在于, 为什么要优化 tableView? 如果是一个简单的 tableView, 那么按照苹果开发文档的步骤来写, 那么就根本不需要优化. 如果是一个复杂的 tableview, 那么该缓存行高的时候, 在 ViewModel 中计算好, 或者在 Controller 中计算好, 然后在 view 出现之前传给 view, 而不去简单的调用estimateRowHeight 或者 rowHeightofCell 这些方法, 或者用FDTemplateLayoutCell 这类第三方进行计算, 以及避免离屏渲染, 栅格化图片这些简单的低级错误, 那么 tableView 也不需要优化. - 说一说 tableView 的重用机制(笔试题)
tableView 的重用机制很好的解决了 tableView 的内存占用问题, tableView 不必要每创建一个 cell 就去内存中开辟一块新的空间, 每次创建 cell的时候通过 dequeueReusableCellWithIdentifier: 方法来创建, 这时候,系统会先去一个名为缓冲池的地方去寻找指定标识(reuse identifier) 的 cell, 如果没有, 那就会直接返回nil, 然后再根据 initWithStyle: reuseIdentifier: 创建一个 cell, 而当 cell 离开界面时, 所占用的内存片区就会被存放到缓存池当中, 以供下次使用. 这是一道送分题 - 说一下控制器的生命周期(笔试题)
- 首先判断一下控制器是否有视图, 如果没有就调用 loadView 方法创建, 要么是通过 storyboard 或者是代码
- 调用 viewDidLoad, 进行下一步的初始化操作, 该方法只会被调用一次
- 在视图显示之前调用 viewWillAppear, 进入 view 的生命周期, 该函数会在视图显示之前都会被调用, 所以有可能会被调用多次
- 在视图显示完以后, 调用 viewDidAppear
- 在视图消失之前, 调用 viewWillDisappear, 同样, 如果需要, 该方法也会被多次调用
- 如果当前布局需要发生改变, 调用 viewWill/DidLayoutSubviews 去处理相关变化
- 说一说 UIView 和 CALayer 之间的关系(笔试题多一点, 难度较大)
UIView 能够在屏幕上显示其实主要还是 CALayer 的功劳, 通过调用 drawRect 方法来渲染自身的内容, 条件 CALayer 属性可以调整 UIView 的外观, UIView 继承自 UIResponder, 能够响应用户事件, 这点是 CALayer 做不到的
iOS 系统中所有界面显示, 界面的元素都是以 UIView 为基础的, 而 UIView 的内部, 就是靠 CALayer(Core Animation Layer) 的类来管理的. UIView 本身, 更像是 CALayer 的一种管理器吧, CALayer 负责去实现效果, 而 UIView 负责把效果展示出来.
这里讲的只是一点浅薄的知识, 其他的比如可以通过 UIView 的 layer 属性来获得对应的 CALayer 的实例, 通过 layerClass 方法来获得对应的主 layer 所使用的类, 而 UIView 的子类, 可以通过override 这个方法, 来让 UView 使用不同的 CALayer 来显示
还有包括诸如 UIView 的 CALayer 的树形结构等等, 太有深度, 一般都不是面试中的主要重点. - 说一说 loadView ?(笔试题)
loadView 用来自定义view, 只要实现了这个方法, 其他通过 xib 或者 sb 创建的 view 都不会被加载.结合前面的控制器声明周期中对 loadView 方法的描述. - 说一说怎样高性能的给 UIImageView 加圆角(笔试, 烂大街题)
一般都会写明请不要使用 cornerRadius 属性.
两种方法: 一种是最简单的方法, 请 UI 吃顿饭, 要他/她再帮你切一个跟背景色相同颜色的正方形内切空心圆的图片就可以了; 另一种麻烦一点, 如果跟 UI 关系不好, 写个分类什么的, 在拿到图片一下, 对图片重绘一下吧. 就是直接在图片上面绘制这么一个遮罩. - 说一说使用 drawRect 的影响
在实际工作中其实我们会经常使用这个方法来做很多事情, 包括上面的重绘, 以及绘制图形, 我用这个绘制过图表, 以及甚至做过动画, 方法依赖 Core Graphics 框架来进行自定义的绘制, 虽然这个方法非常好用, 但是这个方法还是有缺点的: 就是对 touch 事件不是那么的友好. 每次处理完 touch 事件, 比如按钮被点击以后, 都需要调用一次 setNeedDisplay 这个方法来进行强制重绘. 而且这个重绘操作还不止一次! 每点击一次会触发两次. 所以说, 如果当前这个页面使用了次 drawRect 来进行绘制, 而绘制的这些按钮也好, 其他东西也好, 如果会触发大量的 touch 事件, 那么对CPU 以及内存来讲, 都是很不友好的.
再说说 setNeedDisplay 方法, 当调用这个方法的时候, UIKit 就会将当前的layer 标记为 dirty, 但是还是会暂时显示原来的内容, 知道下一次的视图渲染周期, 才会将标记为 dirty 的 layer 重新建立Core Graphics 上下文, 然后将内存中的数据恢复出来, 再使用 CGContextRef 进行绘制.
以上是关于如何面试一个1-3年的 iOS 程序员(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章