关于iOS开发:2021最新iOS面试题总结一

2次阅读

共计 4979 个字符,预计需要花费 13 分钟才能阅读完成。

看完这些,大厂不是梦!!!

明天刚刚开始面试,接下来这几天把遇到的面试题总结如下:

1. 内存治理在理论开发中的利用(必考,曾经被问两次了)

答:
1.UITableView 的数据条数太多时会耗费内存,能够给 UITableViewCell、UICollectionViewCell、UITableViewHeaderFooterView 设置正确的复用 ID,充沛复用。

2. 有透明度的 View(alpha 值在 0 到 1 之间),opaque 的值应该设置为 YES,能够优化渲染零碎、进步性能。(当 alpha 值为 0 或 1 时,opaque 的值对性能没有影响)

3. 防止过于宏大的 XIB/StoryBord 文件,当加载 XIB 文件的时候,所有的内容都会被加到内存里,如果有一个不会立即用到的 View,就是在节约内存资源。

4. 不要让主线程承当过多的工作,否则会阻塞主线程,使 app 失去反馈。

5. 加载本地图片时,应该保障 UIImageView 的大小和图片的大小雷同,因为缩放图片是很耗费资源的,特地是在 UIImageView 嵌套在 UIScrollView 中的状况下。如果是从网络加载的图片,能够等图片加载实现当前,开启一个子线程缩放图片,而后再放到 UIImageView 中。

6. 在适合的场景下抉择适合的数据类型,对于数组:应用索引查问很快,应用值查问很慢,插入删除很慢,对于字典:用键来查找很快,对于汇合:用值来查找很快,插入删除很快。

7. 网络下载文件时压缩(目前 AFNetworking 曾经默认压缩)

8. 当 UIScrollView 嵌套大量 UIView 时会耗费内存,能够模拟 UITableView 的重用形式解决,当网络申请的时候能够应用提早加载来显示申请谬误的页面,因为网络申请谬误的页面不会马上用到,如果每次都先加载进去会耗费内存。

9. 不大可能扭转但常常应用的货色能够应用缓存,比方 cell 的行高能够缓存起来,这样 reloaddata 的时候效率会很高。还有一些网络数据,不须要每次都申请的,应该缓存起来,能够写入数据库,也能够写入 plist 文件。

10. 在 appDelegate 和 UIViewController 中都有解决内存正告的办法,注册并承受内存正告的告诉,一旦收到告诉就移除缓存,开释不须要的内存空间。

11. 一些对象的初始化很慢,比方 NSDateFormatter 和 NSCalendar,但你又必须要应用它,这时能够重用它们,有两种形式,第一种是增加属性到你的类,第二种是创立动态变量(相似于单例)

12. 服务器端和客户端应用雷同的数据结构,防止重复解决数据,UIWebView 中尽可能少的应用框架,用原声 js 最好,因为 UIView 的加载比较慢。

13. 在循环创立变量解决数据的时候,应用主动开释池能够及时的开释内存。

14. 加载本地图片的时候,如果只应用一次应用 imageWithContentOfFile 办法,因为 imageNamed 办法会缓存图片,耗费内存。

总结:面试时我只答了内存治理的法令和 MRC、ARC、主动开释池的区别,并没有说出内存治理在理论开发中是怎么使用的,齐全没有答到点子上。

2. 多线程的理论利用场景,回到主线程的办法(必考,曾经被问两次)

在理论开发中可能会有一些耗时的操作,这时能够开拓一个子线程把耗时的操作放到子线程中,当耗时操作执行结束当前再回到主线程刷新 UI。必须要在主线程刷新 UI,因为多线程是不平安的,如果在子线程中刷新 UI 可能会导致未知谬误。

回到主线程的办法是 performSelectorOnMainTread

延时执行的代码:performSelector:onThread:withObject:waitUntillDone:

应用 GCD 回到主线程的办法:dispatch_get_main_queue()

应用 GCD 开启线程:dispatch_async([əˈsɪŋk])

二者的区别:dispatch_async() 不受运行循环模式的影响

总结:我只答复出了多线程的概念、长处,而面试官次要想听的关键词是:耗时、开启子线程、回到主线程刷新 UI,所答非所问,而且回到主线程的办法名字我也没记住。这段话很重要,简直所有的 iOS 技术面试都会问到,肯定要熟记于心。

3. 对于 GCD 的了解

答:GCD 中有两个外围概念,队列和工作。队列寄存工作,工作的取出遵循 FIFO 准则。队列其实就是线程池,在 OC 中以 dispatch_queue_t 示意,队列分串行队列和并发队列。工作其实就是线程执行的代码,在 OC 中以 Block 示意。在队列中执行工作有两种形式:同步执行和异步执行。

串行队列:工作一个一个执行

并发队列:同一时间有多个工作被执行。

区别: 会不会有工作放在别的线程(因为并发队列是取出一个工作放到别的线程,再取出一个工作放到另一个线程,因为动作很快,能够忽略不计,所以看起来所有工作都是一起执行的)

同步执行: 不会开启新的线程,工作按程序执行。

异步执行: 会开启新的线程,工作能够并发执行。

区别: 会不会开启新的线程。

组合:

同步串行队列:one by one
异步串行队列:one by one(因为前一个工作不执行结束,队列不会调度)
同步并行队列:one by one(因为同步执行不会开启新的线程)
异步并发队列:能够实现工作的并发,常常用到

主队列:主队列是串行队列,只有一个线程,那就是主线程,增加到主队列中的工作会在主线执行。通过 dispatch_get_main_queue 获取主队列。

全局队列:全局队列是并发队列。能够通过 dispatch_get_global_queue 获取不同级别的全局队列。

同步主队列:死锁卡住不执行。
主队列异步:one by one(因为没有开启新线程)

总结:我只答复出了延时操作应用 gcd,应用加载动画时用到了 dispatch_after 办法,都太外表了,面试官想要听的是更深层次的了解,于是问了我对于工作和队列,我没有想到这方面,当前提到 gcd 首先要想到的就是工作和队列,因为工作和队列是 gcd 的外围概念。

4.TCP、HTTP、WebSokect 的区别

答:
IP 协定(网络层协定)
TCP:传输控制协议,次要解决数据如何在网络中传输,面向连贯,牢靠。(传输层协定)
UDP:用户数据报协定,面向数据报,不牢靠。
HTTP:次要解决如何包装数据。(应用层协定)
Socket:是对 TCP/IP 协定的封装,Socket 自身并不是协定,而是一个调用接口(API),通过 Socket,咱们能力应用 TCP/IP 协定。(传输层协定)

HTTP 连贯:短连贯,客户端向服务器发送一次申请,服务器端响应连贯后会立刻端掉。
Socket 连贯:长连贯,实践上客户端和服务器端一旦建设连贯将不会被动端掉。

建设 Socket 连贯至多须要一对套接字,其中一个运行于客户端,称为 ClientSocket,另一个运行于服务器端,称为 ServerSocket。
套接字之间的连贯过程分为三个步骤:服务器监听,客户端申请,连贯确认。

WebSocket 是双向通信协定,模仿 Socket 协定,能够双向发送或承受信息。HTTP 是单向的。
Socket 是传输管制层协定,WebSocket 是应用层协定。

总结:我本人简历上写的货色我还不了解,很难堪,即便说不出来深层次的货色也应该把他们的次要区别说进去。还有网络七层模型肯定要记住,几年前的面试官就问过我我就没记住。

从底层到顶层别离是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

5.iOS 应用程序的生命周期,最次要的是什么

application:willFinishLaunchingWithOptions: 程序启动
application:didFinishLaunchingWithOptions: 入口,只执行一次,启动实现筹备开始运行
applicationWillResignActive: 切换到非活动状态,如按下 home 键、切换程序
applicationDidBecomeActive: 切换到激活状态
applicationDidEnterBackground: 应用程序进入后盾
applicationWillEnterForeground: 应用程序将要被激活
applicationWillTerminate: 应用程序将要退出

App 的启动过程:
关上程序——执行 main 函数——UIAPPlicationMain 函数——初始化 UIAPPlicationMain 函数(设置代理,开启 runloop)——监听系统事件,告诉 AppDelegate——程序完结

总结:面试官问的是应用程序的生命周期,而我答的是 Viewcontroller 的生命周期,面试官次要想听到的关键词应该是:main 函数、UIApplicationMain、AppDelegate、runloop、监听

另外总结一下对于 runloop 的知识点:

runloop:运行循环,在程序运行过程中循环做一些事
runloop 的作用:放弃程序继续运行、解决 App 中的各种事件、进步资源利用率
runloop 在理论我的项目中的利用:控制线程的生命周期、解决 NSTimer 在滑动时进行工作的问题、监控利用的卡顿、性能优化

6.iOS 的外围动画(必考,曾经被问两次)

答:动画有两种根本类型:隐式动画(始终存在,须要手动敞开)和显式动画(不存在,须要手动创立)
UIView 的动画:

UIViewAnimationOptionCurveEaseInOut // 工夫曲线函数,由慢到快

UIViewAnimationOptionCurveEaseIn // 工夫曲线函数,由慢到特地快

UIViewAnimationOptionCurveEaseOut // 工夫曲线函数,由快到慢

UIViewAnimationOptionTransitionFlipFromLeft // 转场从左翻转

UIViewAnimationOptionTransitionFlipFromRight // 转场从右翻转

UIViewAnimationOptionTransitionCurlUp // 上卷转场

UIViewAnimationOptionTransitionCurlDown // 下卷转场

用法:animateWithDuration、transitionWithView

CAAnimation 动画分类:

1. 根底动画(如物品放入购物车进行挪动)(CABasicAnimation)
2. 关键帧动画,图片帧(如人、动物走动)(CAKeyframAnimation)
3. 转场动画(一个到另一个场景,如翻页)(CATransition)
4. 组合动画(CAAnimationGroup)

能够做动画的值:

1. 形态系列:frame bounds
2. 地位系列:center
3. 色调系列:alpha color
4. 角度系列:transform(旋转的角度)

总结:面试官问我如何做一个闪动的成果,我答了扭转色彩,正确答案应该是扭转透明度,还有问我做过哪些动画成果,我只答复了一个我做过的成果,失常应该依照动画的分类,把所有能实现的成果说一遍。

7. 上传大文件

答:能够分片上传、断点续传

总结:这个性能我没做过,没有答出来,但至多应该晓得大文件上传的办法。

最初总结:曾经好几年没面试了,忽然面试一下发现自己曾经把很多基础知识都忘了,而且有些概念了解的基本就不透彻,须要花功夫好好学习一下。尽管很多概念在平时工作中用不到,然而了解这些是一个软件工程师的根本素养,连这些最根底的货色都不会,怎么敢说本人工作了好几年,的确羞愧啊。
:(如果想成为高级软件工程师,底层原理肯定要把握,把握了底层原理能力开发出更高质量的程序,否则不论干了多少年,也只是高级中级的程度。心愿在接下来的面试中持续总结经验和学习。

… 未完待续

有想要支付收费材料的能够进裙或者加好友支付,这里有一个 iOS 交换圈:710 558 675 能够来理解,分享 BAT, 阿里面试题、面试教训,探讨技术,裙里材料间接下载就行,大家一起交流学习!

有想要的面试材料或者其余材料也能够找我,欢送征询!
文章接下来还会继续更新,你也能够私信我及时获取面试相干材料。如果你有什么意见和倡议欢送给我留言。
请 iOS 的小伙伴关注!喜爱的话给一个赞吧!谢谢!谢谢!谢谢!

正文完
 0