电子商务网站设计的认识,平台设计网站公司电话,android app开发 wordpress,太原房产信息网字节iOS面试经验分享#xff1a;HTTP与网络编程 #x1f31f; 嗨#xff0c;我是LucianaiB#xff01;
#x1f30d; 总有人间一两风#xff0c;填我十万八千梦。
#x1f680; 路漫漫其修远兮#xff0c;吾将上下而求索。 目录
字节iOS面试经验分享#xff1a;HTT…字节iOS面试经验分享HTTP与网络编程 嗨我是LucianaiB 总有人间一两风填我十万八千梦。 路漫漫其修远兮吾将上下而求索。 目录
字节iOS面试经验分享HTTP与网络编程 HTTP协议简介iOS中HTTP请求的实现原理HTTPS与HTTP的区别TCP与UDP的区别三次握手四次挥手Cookie与Session流量控制与拥塞控制虚拟内存多线程并发访问共享资源iOS中线程数量的限制堆和栈的区别autoreleasepool的使用App从编译到可执行文件的过程静态库与动态库的区别类是如何添加到可执行文件中的复制粘贴的原理大容器VC的使用方式
最近我有幸参加了字节跳动的iOS面试这不仅是一次技术的挑战更是一场知识的盛宴。面试过程中我深刻感受到了字节对技术细节的严谨态度和对创新思维的高度重视。今天我就把这次面试中关于HTTP与网络编程的那些事儿分享给大家希望能帮到正在准备面试的小伙伴们。
HTTP协议简介
HTTP即超文本传输协议是互联网上应用最为广泛的网络协议之一。它基于TCP协议通过请求-响应模式进行信息交换。客户端如浏览器向服务器发送请求服务器处理后返回响应。这种模式使得客户端和服务器之间的数据交互变得简单而高效。
一个典型的URL地址如https://www.google.com/search?qurl含义#top包含了多个部分每个部分都有其特定的含义
协议https表示使用安全协议访问相比HTTPHTTPS增加了SSL/TLS加密层数据传输更加安全。域名www.google.com表示Google搜索引擎的地址。路径/search表示访问搜索页面。查询参数?qurl含义表示搜索关键词为url 含义。片段标识符#top表示跳转到搜索结果页面的最顶部。
iOS中HTTP请求的实现原理
在iOS开发中发起一个HTTP请求的原理是基于底层的网络协议栈。具体来说它利用TCP或UDP协议建立网络连接然后根据HTTP协议的规范发送请求信息并接收服务器的响应。这个过程涉及到以下几个关键步骤
创建URLRequest对象使用NSURLRequest类创建一个请求对象设置请求的URL、HTTP方法如GET、POST等、请求头信息、请求体等。创建URLSession对象使用NSURLSession类创建一个会话对象它负责管理HTTP请求的执行。可以选择使用默认的共享会话也可以创建自定义的会话。创建URLSessionTask对象使用dataTask(with:completionHandler:)方法创建一个数据任务它负责执行HTTP请求并处理响应数据。执行任务调用resume()方法启动HTTP请求。处理响应数据任务完成之后会回调completionHandler传递响应数据、响应头信息等。
HTTPS与HTTP的区别
HTTPS和HTTP的主要区别在于安全性。HTTPS在HTTP的基础上增加了SSL/TLS加密层使用端口443而HTTP使用的是明文传输端口为80。这意味着在HTTPS中数据在传输过程中被加密即使被截获也无法轻易被解读从而大大提高了数据传输的安全性。
TCP与UDP的区别
TCP和UDP是两种常用的传输层协议它们的主要区别如下
连接方式TCP是面向连接的需要通过三次握手建立连接四次挥手断开连接UDP是无连接的不需要建立连接即可直接发送数据。报头大小TCP数据报的报头大小最少为20字节UDP数据报的报头固定为8字节。交付保证TCP提供可靠的数据传输如果数据在传输过程中丢失会进行重传UDP则不保证数据的可靠传输数据包可能会丢失。流量控制和拥塞控制TCP有流量控制和拥塞控制机制可以根据网络状况调整数据传输速率UDP则没有这些机制。面向对象TCP面向字节流UDP面向报文。
三次握手
三次握手是 TCP 协议建立连接的过程
客户端发送 SYN 包 客户端向服务器发送一个 SYN 包请求建立连接并包含客户端的初始序列号ISN。服务器发送 SYNACK 包 服务器收到 SYN 包后发送一个 SYNACK 包表示同意建立连接并包含服务器的初始序列号ISN和对客户端 SYN 包的确认号ACK。客户端发送 ACK 包 客户端收到 SYNACK 包后发送一个 ACK包确认服务器的 SYNACK 包并包含对服务器 SYNACK 包的确认号ACK。
四次挥手
四次挥手是 TCP 协议断开连接的过程
客户端发送 FIN 包 客户端向服务器发送一个 FI包表示客户端不再发送数据请求关闭连接。服务器发送 ACK 包 服务器收到 FIN 包后发送一个 ACK包确认客户端的 FIN 包。此时服务器仍然可以向客户端发送数据。服务器发送 FIN 包 服务器发送一个 FIN 包表示服务器也不再发送数据请求关闭连接。客户端发送 ACK 包 客户端收到 FIN 包后发送一个 ACK包确认服务器的 FIN 包并表示连接已关闭。
Cookie与Session
在HTTP协议中Cookie和Session是两种常用的会话跟踪技术。Cookie存储在用户本地由浏览器管理而Session存储在服务器端。如果禁用了Cookie可以使用URL重写技术来进行会话跟踪即在URL后面附加sidxxxxx等参数。
流量控制与拥塞控制
流量控制和拥塞控制是网络通信中的两个重要概念。流量控制主要关注单个连接的传输速率通过接收方告知发送方当前的接收能力发送方根据接收方的反馈调整发送速率。拥塞控制则关注整个网络的流量控制通过网络节点的反馈信息如丢包率、延迟等来判断网络是否拥塞并根据判断结果调整发送速率。
虚拟内存
虚拟内存是计算机系统中的一种内存管理技术。当程序运行时如果内存不足系统会将外存的一部分空间作为虚拟内存使用从而扩展可用内存。然而虚拟内存中的数据在断电后会丢失与硬盘等外部存储器不同。
多线程并发访问共享资源
在多线程编程中如果多个线程同时对一个共享资源进行操作可能会导致数据不一致等问题。例如两个线程对一个int a 1的变量同时进行a操作一万次最后a的值可能会小于20000。这是因为a操作并非原子操作多个线程可能读取了相同的旧值并进行加1操作。解决方法包括使用互斥锁、原子操作等。
iOS中线程数量的限制
为了保证系统稳定性和性能iOS对线程数量有着一定的限制。实际情况取决于设备的硬件资源和应用程序的内存使用情况。过多的线程可能会导致系统资源不足从而引发应用程序崩溃或性能下降。因此建议使用GCD或其他更高效的并发机制来管理线程。
堆和栈的区别
堆和栈是两种不同的内存分配方式。堆空间的内存是动态分配的一般存放对象并且需要手动释放内存。栈空间的内存是由系统自动分配一般存放局部变量如对象的地址等值不需要程序员对这块内存进行管理。栈不够用时会发生栈溢出现象此时可以使用堆来存储数据但需要注意及时释放堆内存否则会导致内存泄漏等错误。
autoreleasepool的使用
在iOS开发中autoreleasepool用于管理自动释放对象的生命周期。使用autoreleasepool可以减少内存峰值特别是在需要创建大量临时对象的情况下如在一个循环中不断创建和使用对象。此外在非UI线程和自定义线程中也需要手动创建autoreleasepool以确保在这些线程中创建的自动释放对象能够被及时释放避免内存泄漏。
App从编译到可执行文件的过程
App从编译到变成可执行文件的过程包括以下几个阶段
预处理处理源代码文件中的以#开头的预编译指令。编译将高级语言翻译成汇编语言。汇编将汇编语言变成计算机可识别的二进制代码。链接把目标文件一个或多个和需要的库静态库/动态库链接成可执行文件。
静态库与动态库的区别
静态库和动态库是两种不同的库类型它们的主要区别如下
静态库在程序编译时就将所有要使用的库都装进了程序中然后程序开始运行。优点是程序运行时不需要额外加载库缺点是程序体积较大。动态库程序运行时用到什么库再去链接什么库。优点是程序体积较小缺点是程序运行时需要额外加载库可能会导致程序启动速度变慢。
类是如何添加到可执行文件中的
类信息是在编译和链接阶段被添加到可执行文件中的。编译器会将类信息转换为机器码并生成符号表链接器会将类信息整合到可执行文件中并为其分配内存地址。
复制粘贴的原理
我们常用的复制粘贴功能其原理是使用了共享内存。操作系统会将我们选择的文本、图像、文件等数据复制到一块共享内存区域中当需要粘贴时再从这块共享内存区域中读取数据。
大容器VC的使用方式
在iOS开发中大容器VC的使用方式主要有两种
直接调用父容器VC直接持有子容器VC的引用并在需要时直接调用子容器的声明周期方法。代理模式父容器VC可以定义一个代理协议子容器VC实现该协议。通过代理模式父容器VC可以间接调用子容器VC的方法从而实现解耦和更好的代码组织。 嗨我是LucianaiB。如果你觉得我的分享有价值不妨通过以下方式表达你的支持 点赞来表达你的喜爱 关注以获取我的最新消息 评论与我交流你的见解。我会继续努力为你带来更多精彩和实用的内容。 点击这里LucianaiB 获取最新动态⚡️ 让信息传递更加迅速。