2022 ios面试题

计算机网络

1.TCP为什么是三次握手 四次挥手

第一次握手:第一次握手是客户端发送同步报文到服务端,这个时候客户端是知道自己具备发送数据的能力的,但是不知道服务端是否有接收和发送数据的能力;

第二次握手:当服务端接收到同步报文后,回复确认同步报文,此时服务端是知道客户端具有发送报文的能力,并且知道自己具有接收和发送数据的能力,但是并不知道客户端是否有接收数据的能力;

第三次握手:当客户端收到服务端的确认报文后,知道服务端具备接收和发送数据的能力,但是此时服务端并不知道自己具有接收的能力,所以还需要发送一个确认报文,告知服务端自己是具有接收能力的。

当整个三次握手结束过后,客户端和服务端都知道自己和对方具备发送和接收数据的能力,随后整个连接建立就完成了,可以进行后续数据的传输了。
第一次挥手客户端发起关闭连接的请求给服务端;

第二次挥手:服务端收到关闭请求的时候可能这个时候数据还没发送完,所以服务端会先回复一个确认报文,表示自己知道客户端想要关闭连接了,但是因为数据还没传输完,所以还需要等待;

第三次挥手:当数据传输完了,服务端会主动发送一个 FIN 报文,告诉客户端,表示数据已经发送完了,服务端这边准备关闭连接了。

第四次挥手:当客户端收到服务端的 FIN 报文过后,会回复一个 ACK 报文,告诉服务端自己知道了,再等待一会就关闭连接。
TCP 协议是面向连接的可靠的传输层协议,它的拥塞控制,失败重传等机制在互联网数据传输中是不可或缺的。

2.TCP如何保证数据包有效

TCP 是通过下面几个特性保证数据传输的可靠性:
序列号和确认应答信号
超时重发控制
连接管理
滑动窗口控制
流量控制
拥塞控制

3.http和https区别

HTTPS协议是什么

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由进行,提供了身份验证与加密通讯方法,现在它被广泛用于网上安全敏感的通讯,例如交易支付方面。

超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和服务器之间互相通信的规则,通过因特网传送文档的数据传送协议。

HTTP协议是什么?

HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

HTPP有多个版本,目前广泛使用的是HTTP/1.1版本。

HTTPS和HTTP的主要区别

https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。

http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。

http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https协议需要到ca申请证书,一般免费证书很少,需要交费。http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。http的连接很简单,是无状态的HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。

4.tcp和udp区别
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html

首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。

5.osi 的七层架构以及每层都有哪些协议
https://zhuanlan.zhihu.com/p/32059190

6.你所知道的http请求头和返回码
https://www.51cto.com/article/608197.html

操作系统

1 进程与线程的区别
https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376
https://www.jianshu.com/p/ecb1a559f816

2.0  进程

在iOS 中 一个进程就是一个正在运行的一个应用程序;  比如 QQ.app  ,而且一个app只能有一个进程 不像安卓支持多个进程。

每一个进度都是独立的,每一个进程均在专门且手保护的内存空间内;

iOS中是一个非常封闭的系统,每一个App(一个进程)都有自己独特的内存和磁盘空间,别的App(进程)是不允许访问的(越狱不在讨论范围);

所以,在iPhone中下载了两种音乐播放器,下载的音乐歌曲却是不能共享的!跟安卓完全不同! 

进程 是系统资源分配和调度的一个独立单位,简单的理解就是用来帮程序占据一定的存储空间等的资源。进程拥有自己独立的位置空间,在没有经过进程本身允许的情况下,其他进程不能访问改进程的地址空间

在 iOS 中  UIApplication  这个 类是 是 进程相关的操作的。比如  进程A(程序A) 调用另外一个进程B(程序B) 。  打开iOS 系统的浏览器等 都是 这个类 来负责。

二者之间的区别:
线程是进程的一部分,它是进程中用来执行任务的单位。一个进程可以拥有多个线程,但最少要有一个主线程;每个线程不能独立执行,必须有一个父进程;线程可以拥有自己的堆、栈、计数器和局部变量,一个进程里的全部线程会共享该进程的资源。线程是独立运行的,一个线程并不知道其它线程的存在,在线程运行过程中随时都有可能被挂起,方便其他线程运行;线程是有优先级的,当然主线程的优先级最高,在我们编程的时候也可以设置线程1执行完毕后才执行线程2。

进程的并发性:处理器每次只执行一个进程,然后在多个进程之间快速切换,依次来达到多个进程在单个处理器上同时执行的效果;

进程的并行性:同一时刻,处理器同时执行多个进程;



多线程与多进程的对比:

1.进程之间不能共享内存,线程可以

同一个进程中的线程共享了改进程的很多资源,包括:进程虚拟空间、进程代码段、进程共有数据等,因此线程之间更容易相互通信,多线程的运行效率远远高于多进程;

2.系统创建进程的时候要为其分配系统资源,而创建线程则只需要很小一部分,因此多线程比多进程来的更加容易;

3.多线程可以充分利用处理器(双核或者多核),但是当线程数量达到上限的时候,性能就不在提升了;

4.多线程的进程中一个线程崩溃了就会导致进程崩溃,如果是主线程崩溃会导致程序崩溃;

但是多进程中子进程崩溃了不会影响到其它进程,程序稳定性更好;

5.多线程需要控制线程之间的同步,而多进程则需要控制和主进程之间的交互;

6.如果两个进程之间要相互传输大量的数据,会相当影响性能,多进程适合小数据量传输,密集运算;

2.cpu执行单位

线程是CPU调度的最小单元;

线程的作用:执行app的代码;

 一个进程(App)至少有一个线程,这个进程叫做主线程;

3.堆和栈的区别
https://blog.csdn.net/k346k346/article/details/80849966
https://www.jianshu.com/p/5db3323cf171
4.虚拟地址怎么映射到物理地址

5简述IO多路复用

6.线程有几种状态
https://juejin.cn/post/6844904053130919943

创建(new)------就绪start-----------运行running-----------阻塞sleep----------死亡dead

7死锁的产生条件,如何检查,如何解决

死锁是由于多个线程(进程)在执行过程中,因为争夺资源而造成的互相等待现象,你可以理解为卡主了。产生死锁的必要条件有四个:

*   互斥条件 : 指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
*   请求和保持条件 : 指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
*   不可剥夺条件 : 指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
*   环路等待条件 : 指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。 了解更多:[juejin.cn/post/699469…](https://juejin.cn/post/6994698940843032612 "https://juejin.cn/post/6994698940843032612")

设计模式

1线程安全是如何做到的

2java中IO侠的inputstream用了什么设计模式

3.简述知道的设计模式

4.简述AOP和IOC的作用

  1. socket

swift

1.swift的struct和class的区别

1.
类(class)和结构体(struct),不止在iOS开发中,在其他各种语言开发中都属于老生常谈的问题了,在看class和struct之前,我们先看一下引用类型和结构体的概念。
引用类型:将一个对象赋值给另一个对象时,系统不会对此对象进行拷贝,而会将指向这个对象的指针赋值给另一个对象,当修改其中一个对象的值时,另一个对象的值会随之改变。
值类型:将一个对象赋值给另一个对象时,会对此对象进行拷贝,复制出一份副本给另一个对象,在修改其中一个对象的值时,不影响另外一个对象。

不同点:1.类属于引用类型,结构体属于值类型
2.struct不能继承,class可以继承。
3.类中的每一个成员变量都必须被初始化,否则编译器会报错,而结构体不需要,编译器会自动帮我们生成init函数,给变量赋一个默认值

https://juejin.cn/post/6844903799413276685
2.swift中的方法调用有哪些形式
3.swift和oc有什么区别
4.怎么理解面向协议编程

oc

1 block是如何实现的?block对应的数据结构是什么样的?—block的作用,它对应的数据结构又是什么样的
2,GCd中的block实在堆上还是栈上
3.NSCoding 协议是干什么用的
4.kvo的实现原理
5.NSNotification 是同步还是异步,如果通知发生在子线程,接收在那个线程?
6.NSOperation的哪些特性别者GCD有哪些优势,他有哪些API

UI

事件响应链是如何传递的
什么是异步渲染
layoutsubviews是什么时候调用
一张图片的展示经历了哪些步骤
什么是离屏渲染,什么情况导致的
CoreAnimation这个框架的作用是什么,他跟uikit的关系

引用技术

1arc方案的原理是什么?他是什么时候做的隐式release操作

2循环引用有哪些场景,如何避免
3为什么当我们在使用block时外面要声明weak,还要在block内部强持有一下
4,autoreleasepool(自动释放池)的实现机制是什么?他是什么时候释放内部对象的?他的内部的数据结构是什么样的?当我提到哨兵对象时,会继续问哨兵对象的作用是什么?为什么要这么设计他
5哪些对象会放入autoreleasepool中
6,weak的实现原理是什么?当应用对象销毁他是如何管理内部的hash表的

runtime

1消息发送的流程是怎样的
2关联对象时什么情况会导致内存泄露
3消息转发的流程是什么
4.category(扩展)能否添加属性,为什么?能否添加实例变量,为什么?

解答:类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。经常会在ios的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。这里添加的属性,不会自动生成实例变量,这里添加的属性其实是添加的getter与setter方法。
https://blog.csdn.net/shifang07/article/details/100536487
匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。

5.iOS类别(Category)与扩展(Extension,匿名类别)

https://www.jianshu.com/p/0968f9302c80

runloop

1.讲一下runloop的理解
2.可以用runloop实现什么功能

性能优化

1.对tableview进行性能优化有哪些方式
2.xcode的instruments都有哪些调试工具
3.讲一下你做过的性能优化的事情
4,如何检测卡顿,都有哪些方法
5.缩小包体积有哪些方案

你可能感兴趣的:(2022 ios面试题)