字节iOS面试经验分享:HTTP与网络编程
字节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?q=url+含义#top,包含了多个部分,每个部分都有其特定的含义:
- 协议:
https,表示使用安全协议访问,相比HTTP,HTTPS增加了SSL/TLS加密层,数据传输更加安全。 - 域名:
www.google.com,表示Google搜索引擎的地址。 - 路径:
/search,表示访问搜索页面。 - 查询参数:
?q=url+含义,表示搜索关键词为"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)。
- 服务器发送 SYN+ACK 包: 服务器收到 SYN 包后,发送一个 SYN+ACK 包,表示同意建立连接,并包含服务器的初始序列号(ISN)和对客户端 SYN 包的确认号(ACK)。
- 客户端发送 ACK 包: 客户端收到 SYN+ACK 包后,发送一个 ACK包,确认服务器的 SYN+ACK 包,并包含对服务器 SYN+ACK 包的确认号(ACK)。
四次挥手
四次挥手是 TCP 协议断开连接的过程
- 客户端发送 FIN 包: 客户端向服务器发送一个 FI包,表示客户端不再发送数据,请求关闭连接。
- 服务器发送 ACK 包: 服务器收到 FIN 包后,发送一个 ACK包,确认客户端的 FIN 包。此时服务器仍然可以向客户端发送数据。
- 服务器发送 FIN 包: 服务器发送一个 FIN 包,表示服务器也不再发送数据,请求关闭连接。
- 客户端发送 ACK 包: 客户端收到 FIN 包后,发送一个 ACK包,确认服务器的 FIN 包,并表示连接已关闭。
Cookie与Session
在HTTP协议中,Cookie和Session是两种常用的会话跟踪技术。Cookie存储在用户本地,由浏览器管理,而Session存储在服务器端。如果禁用了Cookie,可以使用URL重写技术来进行会话跟踪,即在URL后面附加sid=xxxxx等参数。
流量控制与拥塞控制
流量控制和拥塞控制是网络通信中的两个重要概念。流量控制主要关注单个连接的传输速率,通过接收方告知发送方当前的接收能力,发送方根据接收方的反馈调整发送速率。拥塞控制则关注整个网络的流量控制,通过网络节点的反馈信息,如丢包率、延迟等,来判断网络是否拥塞,并根据判断结果调整发送速率。
虚拟内存
虚拟内存是计算机系统中的一种内存管理技术。当程序运行时,如果内存不足,系统会将外存的一部分空间作为虚拟内存使用,从而扩展可用内存。然而,虚拟内存中的数据在断电后会丢失,与硬盘等外部存储器不同。
多线程并发访问共享资源
在多线程编程中,如果多个线程同时对一个共享资源进行操作,可能会导致数据不一致等问题。例如,两个线程对一个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 ,获取最新动态,⚡️ 让信息传递更加迅速。

相关文章:
字节iOS面试经验分享:HTTP与网络编程
字节iOS面试经验分享:HTTP与网络编程 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 字节iOS面试经验分享:HTT…...
在汇编语言中,ASSUME 是一个用于告诉汇编器如何将段寄存器与特定段名称关联的指令
在汇编语言中,ASSUME 是一个用于告诉汇编器如何将段寄存器与特定段名称关联的指令。它主要用于定义代码段、数据段和栈段等的段寄存器使用方式,帮助编译器生成正确的代码。 具体到 ASSUME DS:DATA, CS:CODE, SS:STACK,这行代码的作用如下&…...
代码随想录_栈与队列
栈与队列 232.用栈实现队列 232. 用栈实现队列 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 思路: 定义两个栈: 入队栈, 出队栈, 控制出入…...
Ubuntu 手动安装 Open WebUI 完整指南
Ubuntu 手动安装 Open WebUI 完整指南 前提条件 在安装 Open WebUI 之前,请确保您的系统满足以下要求: Ubuntu 22.04 LTS 或更高版本Python 3.10Node.js 18Git至少 4GB 内存足够的磁盘空间(推荐 20GB 以上) 安装步骤 1. 更新…...
【Oracle篇】使用Hint对优化器的执行计划进行干预(含单表、多表、查询块、声明四大类Hint干预)
💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...
论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅
1.论文链接:Modeling Linkage Disequilibrium and Performing Association Studies through Probabilistic Graphical Models: a Visiting Tour of Recent Advances 摘要: 本章对概率图模型(PGMs)的最新进展进行了深入的回顾&…...
【信息系统项目管理师-选择真题】2005上半年综合知识答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2~3题】【第4~6题】【第7题】【第8题】【第9题】【第10~11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18~19题】【第20题】【第21~22题】【第23题】【第24~25题】【第…...
【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)
1. 简介 柱状图作为科研论文中常用的实验结果对比图,本文采用了3组实验对比的效果展示图,代码已调试好,只需替换数据即可生成相关柱状图,为科研加分。通过获得Nature配色的柱状图,让你的论文看起来档次更高࿰…...
【Elasticsearch】 Intervals Query
Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则,这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…...
YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)
目录 前言 1. 需修改的源码文件 1.1添加C2f_v2模块 1.2 修改模型读取方式 1.3 增加 L1 正则约束化训练 1.4 在tensorboard上增加BN层权重和偏置参数分布的可视化 1.5 增加剪枝处理文件 2. 工程目录结构 3. 源码文件修改 3.1 添加C2f_v2模块和模型读取 3.2 添加L1正则…...
数论问题80
命题1,证明,方程(2x)^(2x)-1y^(z1)没有正整数解。 分析:设x,y,z∈Z满足方程,当x1时,3y^(z1),无论任意y,z取任意正整数值,3y^(z1)都不成立。方程左端分解因式,…...
后端token校验流程
获取用户信息 前端中只有 await userStore.getInfo() 表示从后端获取数据 在页面中找到info对应的url地址,在IDEA中查找 这里是getInfo函数的声明,我们要找到这个函数的使用,所以点getInfo() Override public JSONObject getInfo() {JSO…...
Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)
文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件(金甲模板)5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中,使用角色(Role)来远程部…...
C语言自定义数据类型详解(二)——结构体类型(下)
书接上回,前面我们已经给大家介绍了如何去声明和创建一个结构体,如何初始化结构体变量等这些关于结构体的基础知识。下面我们将继续给大家介绍和结构体有关的知识: 今天的主题是:结构体大小的计算并简单了解一下位段的相关知识。…...
OpenFeign的工作原理是什么?它第一次加载的时候为什么慢?
OpenFeign的工作原理是什么?它第一次加载的时候为什么慢? OpenFeign的工作原理 接口定义: 开发者定义一个接口,并使用 FeignClient 注解指定该接口所对应的微服务名称。在接口的方法上添加 HTTP 方法相关的注解(如 …...
LLM架构与优化:从理论到实践的关键技术
标题:“LLM架构与优化:从理论到实践的关键技术” 文章信息摘要: 文章探讨了大型语言模型(LLM)开发与应用中的关键技术,包括Transformer架构、注意力机制、采样技术、Tokenization等基础理论,以…...
Maven的单元测试
1. 单元测试的基本概念 单元测试(Unit Testing) 是一种软件测试方法,专注于测试程序中的最小可测试单元——通常是单个类或方法。通过单元测试,可以确保每个模块按预期工作,从而提高代码的质量和可靠性。 2.安装和配…...
Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南
本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。 安装方法 在 Jetson 上安装 Pytorch 只有两种方法。 一种是直接安装他人已经编译好的 PyTorch 轮子;一种是自己从头开始开始构建 PyTorch 轮子并且安装。 使用轮子安装 可以从我的 Gi…...
AI协助探索AI新构型的自动化创新概念
训练AI自生成输出模块化代码,生成元代码级别的AI功能单元代码,然后再由AI组织为另一个AI,实现AI开发AI的能力;用AI协助探索迭代新构型AI将会出现,并成为一种新的技术路线潮流。 有限结点,无限的连接形式&a…...
Kafka 压缩算法详细介绍
文章目录 一 、Kafka 压缩算法概述二、Kafka 压缩的作用2.1 降低网络带宽消耗2.2 提高 Kafka 生产者和消费者吞吐量2.3 减少 Kafka 磁盘存储占用2.4 减少 Kafka Broker 负载2.5 降低跨数据中心同步成本 三、Kafka 压缩的原理3.1 Kafka 压缩的基本原理3.2. Kafka 压缩的工作流程…...
GWO优化GRNN回归预测matlab
灰狼优化算法(Grey Wolf Optimizer,简称 GWO),是一种群智能优化算法,由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为,核心思想在于模拟灰狼社会的结构与行…...
Unity 粒子特效在UI中使用裁剪效果
1.使用Sprite Mask 首先建立一个粒子特效在UI中显示 新建一个在场景下新建一个空物体,添加Sprite Mask组件,将其的Layer设置为UI相机渲染的UI层, 并将其添加到Canvas子物体中,调整好大小,并选择合适的Spriteÿ…...
【大厂AI实践】OPPO:大规模知识图谱及其在小布助手中的应用
导读:OPPO知识图谱是OPPO数智工程系统小布助手团队主导、多团队协作建设的自研大规模通用知识图谱,目前已达到数亿实体和数十亿三元组的规模,主要落地在小布助手知识问答、电商搜索等场景。 本文主要分享OPPO知识图谱建设过程中算法相关的技…...
C# 添加、替换、提取、或删除Excel中的图片
在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观。此外,对于已有图片,你有事可能需要更新图片以确保信息的准确性,或者将Excel 中的图片单独保存,用于资料归档、备…...
AI大模型开发原理篇-5:循环神经网络RNN
神经概率语言模型NPLM也存在一些明显的不足之处:模型结构简单,窗口大小固定,缺乏长距离依赖捕捉,训练效率低,词汇表固定等。为了解决这些问题,研究人员提出了一些更先进的神经网络语言模型,如循环神经网络、…...
赛博算卦之周易六十四卦JAVA实现:六幺算尽天下事,梅花化解天下苦。
佬们过年好呀~新年第一篇博客让我们来场赛博算命吧! 更多文章:个人主页 系列文章:JAVA专栏 欢迎各位大佬来访哦~互三必回!!! 文章目录 #一、文化背景概述1.文化起源2.起卦步骤 #二、卦象解读#三、just do i…...
iperf 测 TCP 和 UDP 网络吞吐量
注:本文为 “iperf 测网络吞吐量” 相关文章合辑。 未整理去重。 使用 iperf3 监测网络吞吐量 Tom 王 2019-12-21 22:23:52 一 iperf3 介绍 (1.1) iperf3 是一个网络带宽测试工具,iperf3 可以擦拭 TCP 和 UDP 带宽质量。iperf3 可以测量最大 TCP 带宽…...
内外网文件摆渡企业常见应用场景和对应方案
在如今的企业环境中,内外网文件摆渡的需求越来越常见,也变得越来越重要。随着信息化的不断推进,企业内部和外部之间的数据交换越来越频繁,如何安全、高效地进行文件传输成了一个关键问题。今天,咱就来聊聊内外网文件摆…...
【微服务与分布式实践】探索 Sentinel
参数设置 熔断时长 、最小请求数、最大RT ms、比例阈值、异常数 熔断策略 慢调⽤⽐例 当单位统计时⻓内请求数⽬⼤于设置的最⼩请求数⽬,并且慢调⽤的⽐例⼤于阈值,则接下来的熔断时⻓内请求会⾃动被熔断 异常⽐例 当单位统计时⻓内请求数⽬⼤于设置…...
论文阅读(十五):DNA甲基化水平分析的潜变量模型
1.论文链接:Latent Variable Models for Analyzing DNA Methylation 摘要: 脱氧核糖核酸(DNA)甲基化与细胞分化密切相关。例如,已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此,通过研究DNA…...
