2021iOS面试题总结day8

准备:
1.UIView和CALayer的坐标系有什么区别?
CALayer的坐标系统比UIView多了一个anchorPoint属性(锚点),锚点决定了图层的绘制位置以及动画表现时其参照的点,锚点的x轴与y轴的取值范围都是0~1之间。

2.UIView层发生什么事件会导致App崩溃?

在子线程中刷线UI可能导致崩溃

3.为什么给nil发送消息不会引发崩溃?

Objective-C中的函数调用都是通过objc_msgSend进行消息发送来实现的,而objc_msgSend会通过判断参数self来决定是否发送消息,如果传递给objc_msgSend的参数self为 nil,那么selector会被置空,该函数不会执行而是直接返回。

4.UI优化的经验

5.怎么检测app是否掉帧了?

在主线程里添加了阻碍主线程去响应点击、滑动事件、以及阻碍主线程的UI绘制等的代码,都是造成卡顿的常见原因。

卡顿监控一般有两种实现方案:

(1). 主线程卡顿监控。通过子线程监测主线程的runLoop,判断两个状态区域之间的耗时是否达到一定阈值。

(2). FPS监控。要保持流畅的UI交互,App 刷新率应该当努力保持在 60fps。FPS的监控实现原理,上面已经探讨过这里略过。

6.Flutter
7.跨平台
8.block的基础原理

Block本质上是一个OC对象,因为它继承自NSBlock,而NSBlock又继承自NSObject,所以Block内部是有一个isa指针的。
并且,Block是一个封装了函数调用以及函数调用环境的OC对象。

9._forwarding是什么

10.线程和队列的关系

11.@dynamic的应用场景
12.KVO原理
13.OC怎么找到一个方法
14.性能优化、内存优化

之前准备的:
1.TCP、UDP的区别
TCP:面向连接、可靠、发送数据之前需要先建立连接(安全)(一对一)
UDP:面向数据报、不可靠、发送数据之前不需要建立连接(速度快)(一对一、一对多、多对一、多对多)
2.TCP如何实现有效传输
3.TCP三次握手、四次挥手

所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。

4.线程和进程的区别,为什么要有线程,线程拥有什么独立的资源,多线程如何安全的访问进程中的资源,讲一下各种锁
进程是操作系统资源分配的最小单位,线程是CPU调度的基本单位,
多线程防止主线程堵塞、提高运行效率
同一块资源,被多个线程同时读写操作时,任然能够得到正确的结果,称之为线程是安全的。

解决方案:使用线程同步技术(同步,就是协同步调,按预定的先后次序进行)
常见的线程同步技术是:加锁

什么是锁:
一种同步机制,在存在于多线程的环境中实施的对资源的限制访问,排除并发的策略。

iOS中的锁:递归锁、条件锁、分布式锁、一般锁、互斥锁(休眠状态)、自旋锁(死循环)
常用的:
@synchronized关键字加锁
NSLock对象锁
NSConditionLock条件锁
NSRecursiveLock递归锁
pthread_mutex互斥锁(c语言)

5.数组和链表的区别
6.http2.0的原理,https的原理(加密的解释),https和http的区别,为什么要使用https

虽然 HTTP1.1 默认是开启 Keep-Alive 长连接的,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点

针对同一域名,在请求较多的情况下,HTTP1.1 会开辟多个连接,据说浏览器一般是6-8 个,较多连接也会导致延迟增大,资源消耗等问题

HTTP1.1 不安全,可能存在被篡改、被窃听、被伪装等问题。当然,前阵子 Apple 推广 HTTPS 的时候,相信很多人已经接入 HTTPS

HTTP 的头部没有压缩,header 的大小也是传输的负担,带来更多的流量消耗和传输延迟。并且很多 header 是相同的,重复传输是没有必要的。

服务端无法主动推送资源到客户端

HTTP1.1的格式是文本格式,基于文本做一些扩展、优化相对比较困难,但是文本格式易于阅读和调试,但HTTPS之后,也变成二进制格式了,这个优势也不复存在

在 HTTP2.0中,上面的问题几乎都不存在了。HTTP2.0 的设计来源于 Google 的 SPDY 协议。

http:无连接、无状态

HTTP1.0使用非持久连接。HTTP1.1 默认使用持久连接<keep-alive>

http2.0:

https和http的区别:
https是http的安全版,在http的基础上加入SSL层(安全套接字),对数据传输进行加密和身份验证。

https的原理:
1.服务器用非对称加密(RSA)生产公钥和私钥
2.服务器把私钥发给客户端,自己保留公钥
3.客户端用公钥生成密钥,密钥是将来服务器端和客户端通信的钥匙
4.客户端用公钥加密密钥,发给服务器
5.服务器拿到密钥以后用私钥解密密钥,这样两端都获得了通信的密钥

7.volatile表示变量随时可以改变
8.网络7层模型各层功能和协议、TCP/IP四层

OSI网络体系结构各层协议:

应用层:TELNET、FTP、TFTP、SMTP、SNMP、HTTP、BOOTP、DHCP、DNS(注:DNS使用的传输协议既可为TCP又可为UDP)

表示层:
文本:ASCII,EBCDIC
图形:TIFF,JPEG,GIF,PICT
声音:MIDI,MPEG,QUICKTIME

会话层:Socket、NFS、SQL、RPC 、X-WINDOWS、ASP(APPTALK会话协议)、SCP

传输层:TCP、UDP、SPX

网络层:IP、IPX、ICMP、RIP、OSPF(Open Shortest Path First开放式最短路径优先)
数据链路层:SDLC、HDLC、PPP、STP(Spanning Tree Protocol)、帧中继

物理层:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45

9.线程中的通信方式
答:一个线程传递数据给另一个线程,在一个线程中执行完特定的任务后,转到另一个线程继续执行任务。
10.内存泄漏的处理方式
11.斐波那契额数列
12.快排
13.中序遍历一个二叉树
14.并发和并行分别是什么意思,多线程是并发还是并行?

并发性(Concurrence):指两个或两个以上的事件或活动在同一时间间隔内发生。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
  并行性(parallelism)指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
  区别:一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。
  前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。
  两者的联系:并行的事件或活动一定是并发的,但反之并发的事件或活动未必是并行的。并行性是并发性的特例,而并发性是并行性的扩展。

多线程是并发

15.反转链表
16.iOS9-13,每个版本讲一个特性
17.夜间模式怎么实现,除了通知还有什么更优雅的方式?
18.SDWebImage原理,不用SDWebImage如何实现类似逻辑?
SDWebImage加载图片的过程大致如下:

1.从内存(字典)中找图片(当这个图片在本次使用程序的过程中已经被加载过),找到直接使用。
2.从沙盒中找(当这个图片在之前使用程序的过程中被加载过),找到使用,缓存到内存中。
3.从网络上获取,使用,缓存到内存,缓存到沙盒。

19.每个tableviewcell都有一个UIImageView要加载,如果没有缓存,五个cell请求一个url,同时发请求不实际,如何处理?
20.微信TableView滑动的时候,动图是不动的,为什么?(Runloop的Mode决定的)
21.WebSocket
22.不用递归打印一个UIView的所有subviews?
23.设计一个图片缓存系统
24.http是应用层协议
25.http常见返回码

答:状态码由3位数字组成,第一位标识响应的类型,常用的5大类状态码如下:
1xx:表示服务器已接收了客户端的请求,客户端可以继续发送请求
2xx:表示服务器已成功接收到请求并进行处理
3xx:表示服务器要求客户端重定向
4xx:表示客户端的请求有非法内容
5xx:标识服务器未能正常处理客户端的请求而出现意外错误

26.http除了get、post还有哪些?
27.https能防止中间人攻击吗?
28.https怎么抓包?
29.不使用gcd如何保证线程安全?
30.如何实现多个任务实现后再统一处理?
31.iOS有哪些多线程方式?
pthread(C语言、开发者管理线程生命周期)、NSThread(OC、面向对象、开发者管理线程生命周期)、GCD(C语言、自动管理线程的生命周期)、NSOperation(基于GCD,面向对象、OC、自动管理线程的生命周期)
更倾向于GCD
32.同步异步的区别
33.串行队列和并行队列的区别
34.队列和线程的关系
35.死锁是怎么产生的?
主队列同步
解决办法:同步换成异步
主队列换成其他串行或并行队列
36.https用的是对称加密还是非对称加密,什么是对称加密、非对称加密
37.TCP挥手,第三次不挥手会怎样?
38.单例模式,其他设计模式简介

单例:一个类只被实例化一次,一个类只有一个对象

委托、观察者、MVC
39.DNS
40.在堆中找指定的一个元素的复杂度是多少?
41.MVC、MVP、MVVM应用和彼此本质区别?
42.TCP核心机制(滑动窗口、快速重传、拥塞控制)
43.HTTP请求格式
44.get、post区别
get:提交数据不安全、客户端地址栏可见、提交数据大小有限
post:提交数据安全、数据置于消息主体内、客户端不可见、提交数据大小没有限制
45.若建立时间较长,http怎么优化?
46.Block:可以获取其他函数局部变量的匿名函数

刚刚参加了今日头条的面试,第一道题我就不会,而且连问题都没听懂,是关于进程的具体问题,面完试也是怎么想都想不起来。

其他能想起来的问题:

1.会引发内存泄漏的情况
2.Block使用的注意事项,为什么延时操作要加Strong关键字?
4.NSTimer具体怎么释放?
5.上线以后如何监测app的卡顿情况?
6.一张图片占用内存大小如何计算?
7.如何性能优化?
8.手写一个单例,不用dispatch_once如何保证线程安全?(加锁)
9.加锁具体如何操作?
10.WKWebView使用有什么问题?

总结:
这么多天第一次参加大厂的面试,确实很有深度,每一个问题都会深入的问,直到问到你不会为止。我基本没答上来几个,而且面试官一看就是大牛,我看见他就特别紧张,昨天刚看过的问题又忘了。内存泄露、性能优化、线程安全,这些已经是必问的问题了。我之前工作的公司是小公司,app的用户量不多,实际工作中基本不会接触到这些问题。而大厂的app用户量是亿级的,这些问题是必须要处理的,像线上监测卡顿的问题,用户量少的话能检测到闪退就不错了,哪还会在乎使用的卡顿问题。但是这也是做好一个优质app必须掌握的,确实应该好好学习一下。我觉得这些应该是我今后研究的主要方向,从初级工程师向高级工程师的转变就是从能做出来一个app到做出来一个优质app的转变。光死记硬背是完全不行的,人家一深入问就不会了,必须得花时间好好研究一下了。

推荐阅读更多精彩内容

  • 今天刚刚开始面试,接下来这几天把遇到的面试题总结如下: 1.内存管理在实际开发中的应用(必考,已经被问两次了) 答...
    paperclouds阅读 994评论 4 14
  • 1、OC中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码。【难度系数★★】 1)创建线程的方法...
    木旁_G阅读 1,306评论 2 16
  • 最近由于换工作的原因,需要参加面试,然后就到处收集了一些当下的面试题供自己复习使用。下面就分享出来,希望能够帮到你...
    wuyukobe阅读 1,525评论 3 24
  • 1.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别? A:...
    一意孤行的程序猿阅读 1,837评论 0 13
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 6,229评论 0 6