IOS最全面试题-Offer直通车
文章平均质量分 90
17年+码农经历了很多次面试,也多次作为面试官面试别人,多次ios面试和面试别人,深知哪些面试题是会被经常问到,熟背八股文和总结好自己项目经验,将让你在面试更容易拿到Offer。长期更新ios面试题,分享面试技巧和推荐ios的就业机会,不定时在线答疑。
大模型大数据攻城狮
在阿里巴巴等多种类型公司工作过,第一份工作是在大厂做移动开发,后来在创业公司由于团队需要做后台开发、嵌入式开发等几乎全栈开发,最近这些年还保持必要全栈开发,精力更多在大数据、大模型等领域。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
iOS 开发面试 50 个高频易混淆知识点详解
很多人不清楚 Foundation 和 Core Foundation 之间的桥接转换,以及三个桥接关键字的区别。:很多人不清楚 Auto Layout 的原理,以及它与 Frame 布局的优缺点。:很多人不清楚 Swift 中单例模式的正确实现方式,以及单例模式的优缺点。:很多人不清楚工厂模式的作用,以及简单工厂、工厂方法、抽象工厂的区别。:很多人不清楚主队列和全局队列的特性,以及它们的使用场景。:很多人不清楚观察者模式的作用,以及它与代理模式的区别。原创 2026-06-03 23:45:44 · 527 阅读 · 0 评论 -
iOS后台保活的“暗黑”兵法:被系统强杀前,你能做的5个极限动作
设想一下,如果你的App是一个极其依赖时效性的工具——比如你搞的一套高频量化交易监控面板,或者是一个需要实时拉取最新行情的数字货币看板,用户早晨睁开眼第一次点开App,如果看到的是昨天的K线,哪怕只卡顿了加载的那两秒钟,体验也是极具破坏性的。很多技术团队在处理App被杀后的体验时,做得很糙。在嵌入式开发中,比如复杂的车规级CAN总线调度,一旦检测到电压骤降,系统根本没时间去处理那些乱七八糟的低优先级报文,唯一要做的是依靠电容里残存的那一点点电量,把最核心的行驶状态数据火速写入NVRAM(非易失性存储器)。原创 2026-04-20 12:56:43 · 284 阅读 · 0 评论 -
Instruments高阶靶戏:用Time Profiler扒光主线程的性能毒瘤
其实大部分资讯类、社交类应用,页面里占据绝对大头的元素就是——字。咱们之前提过把计算高度的任务扔到后台,但这只解决了一半问题。当真正要把一段极其复杂的富文本(包含各种Emoji、链接高亮、不同字号、甚至是内联图片)画到屏幕上时,系统的。原创 2026-04-12 13:09:46 · 114 阅读 · 0 评论 -
IOS开发拒绝裸奔: 手把手带你打造千万级日活App的Crash防火墙
如果你的内存调度策略出了岔子,短时间内堆内存被打爆,系统的自保机制会瞬间切断整个集装箱的电网连接,连故障代码都不会给你留一个。A线程在读数据,B线程突然把数据释放了,A线程拿到了一块已经被系统回收的内存,当你试图向这块内存发消息时,恭喜你,App瞬间消失,留下一句冰冷的。干干净净,再也不会有遗留的野指针监听,也彻底免疫了多次 remove 导致的崩溃(因为 Proxy 内部哈希表可以去重,移过一次就删掉记录,后续的 remove 直接被 return 掉)。野指针的崩溃堆栈通常是乱码,极难排查。原创 2026-03-04 09:46:21 · 451 阅读 · 0 评论 -
IOS彻底干掉单例屎山:响应式数据流在跨界面环境中的优雅穿透
第一章里我们吐槽过只能存基础类型。但如果你就是个极简主义者,死活不想写,非要用来搞定全局的复杂主题同步,有没有可能?技术上完全可行,而且手法极其硬核。底层其实是认协议的。只要你能把一个庞大的配置结构体,安全地转换成一个字符串(String)存进去,拿出来的进候再转换回来,你就能让突破类型的枷锁。我们要请出Codable和来做这个中间转换人。// 定义一个极其复杂的主题配置结构var chartAccentColorHex: String // 存个十六进制给图表用。原创 2026-03-04 12:45:18 · 406 阅读 · 0 评论 -
大厂工程化实践:如何构建可运维、高稳定性的 Flutter 混合体系
说实话,第一次决定在几百万日活的原生App里引入Flutter的时候,我手都在抖。老板只关心两件事:新功能上线快不快?包体积会不会暴涨?你要是直接把Flutter默认配置往工程里一扔,打包出来一看,,那你离被优化也不远了。我们得先搞清楚Flutter到底带进来了啥。除了Dart代码本身(这其实占不了多少),大头全是还有那一堆icu数据。这时候你必须得做个外科手术式的裁剪。别傻乎乎地全量引入。你得在里对ABI下手。现在的手机,基本上和。原创 2026-02-03 14:42:05 · 606 阅读 · 0 评论 -
ios开发拒绝“玄学”Crash:从循环引用到脏内存,构建你的系统性排查思维模型
你申请了内存,写了数据,这块内存就是脏的。系统无法直接回收它,除非你显式释放,或者系统把它 swap 出去(但在 iOS 上,Compressed Memory 机制虽然能压缩,但不会像桌面系统那样频繁 swap 到磁盘,一旦压缩内存也撑不住,你也得挂)。所以,排查 OOM 的核心心法只有一条:不要问“哪里漏了”,要问“每一刻,留在这个页面上的内存,凭什么必须在这里?一旦内存水位线逼近阈值(不同机型不同,老机器可能 600MB 就危,新机器能抗 1.5GB),系统发个警告。原创 2026-01-24 09:16:05 · 690 阅读 · 0 评论 -
当GPS失效时我们靠什么?万字拆解出行APP多源融合定位的解决方案
很多客诉是这样的:司机说:“我到了,系统都显示我到了,我等了5分钟,乘客不来,我取消还要扣我钱?乘客说:“我就在定位点,根本没看见车,司机那就是诈骗!在地库这种弱网弱定位环境,“到达(Arrival)”这个状态机的翻转,是整个订单系统的风暴眼。如果你只用简单的来判定到达,那你离在大厂被开除不远了。因为定位漂移会导致司机明明在50米外,坐标却跳进了圈里,系统误判到达,开始计费。几秒后坐标跳回去,系统又判定“司机驶离”,这种反复横跳(Flickering)是系统大忌。原创 2026-01-19 20:11:52 · 806 阅读 · 0 评论 -
知乎ios开发面试题及参考答案
纯代码开发时,重写loadView// 纯代码创建控制器视图// 1. 创建自定义根视图(UIScrollView)// 暂设contentSize,实际在viewDidLayoutSubviews中调整// 2. 添加子视图titleLabel.text = @"自定义loadView示例";// 3. 赋值给self.view,完成根视图创建// 视图创建完成后,配置子视图属性(不涉及布局)// 布局完成后,调整contentSize(基于实际视图尺寸)原创 2026-01-10 00:02:47 · 892 阅读 · 0 评论 -
别让WebView成为特洛伊木马:千万级日活金融App的H5安全填坑实录
金融App的H5页面,最怕的是什么?是DNS劫持,或者是CDN被污染。用户以为打开的是你的理财页面,实际上JS文件在传输过程中被中间人替换了,注入了一段偷取Cookie的代码。本地资源拦截。利用,我们可以把核心的JS框架(如React, Vue, 或者你们自研的Bridge.js)打包在App本地。快:秒开,不用网络请求。稳:只要App包没被篡改,JS就是安全的。但是,这里藏着一个巨大的坑。如果你只是简单地根据文件名匹配来返回本地资源,攻击者可能会构造一个同名的恶意请求。所以,必须校验Hash值。原创 2025-12-30 21:22:32 · 1125 阅读 · 0 评论 -
虾皮(Shopee)ios开发面试题及参考答案(下)
索引是MySQL存储引擎中对表中一列或多列的值进行排序的数据结构(主流为B+树),本质是“有序的快速查找数据结构”,其作用是将无序的数据变为有序,从而避免全表扫描,大幅提升查询效率。减少数据冗余:避免同一数据重复存储(如用户姓名既存于订单表又存于用户表);保证数据一致性:修改数据时只需修改一处,避免多处修改导致不一致;消除异常:避免插入异常(如无法插入无订单的用户)、更新异常(如修改用户姓名需修改所有订单记录)、删除异常(如删除订单导致用户信息丢失)。原创 2025-12-27 10:47:14 · 958 阅读 · 0 评论 -
虾皮(Shopee)ios开发面试题及参考答案(上)
DNS劫持是移动端网络安全中的常见攻击方式,iOS开发中(如APP的域名解析、网络请求)需重点防范,理解DNS劫持的原理和防范措施是面试的核心考点,能结合iOS的具体防护方案(如DNSSEC、HTTPS DNS)说明会大幅加分。DNS(域名系统)的核心作用是将域名(如)解析为IP地址(如流量劫持:将用户的正常请求导向钓鱼网站、广告页面,窃取用户数据或牟取广告收益;数据篡改:拦截用户的网络请求,篡改响应数据(如购物金额、订单信息);服务阻断。原创 2025-12-27 10:33:57 · 1677 阅读 · 0 评论 -
美团ios开发100道面试题及参考答案(中)
UICollectionView的核心优势是“单元格复用”和“布局解耦”,通过继承创建继承自// 列数(默认3列)// 列间距(默认10pt)// 行间距(默认10pt)// 内边距(默认UIEdgeInsetsMake(10,10,10,10))// 高度计算block:外部传入,根据indexPath动态计算cell高度@end// 内部追踪变量// 每列当前高度// 所有cell的布局属性@end// 初始化布局。原创 2025-12-24 09:19:04 · 594 阅读 · 0 评论 -
美团ios开发100道面试题及参考答案(下)
定义:指针是一个“变量”,其存储的不是数据本身,而是目标变量的内存地址(如0x7ffeee0a0a6c),通过该地址可间接访问目标变量;类型 *指针变量名,如int *p(int类型的指针p)、(OC中NSString类的指针str);核心操作:&变量名,获取变量的内存地址,赋值给指针(如int a = 10;*指针变量名,通过指针存储的地址访问目标变量(如*p = 20;,修改a的值为20);示例代码(OC):// 基本类型指针int a = 10;// p存储a的内存地址。原创 2025-12-24 23:22:24 · 1028 阅读 · 0 评论 -
美团ios开发校园招聘面试题及参考答案
HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)的核心差异集中在安全性、传输层基础、数据传输状态等方面,具体区别可通过以下表格清晰呈现:HTTPS的加密过程依赖对称加密和非对称加密的协同作用,二者分工明确:非对称加密解决“密钥安全交换”问题,对称加密解决“数据高效传输”问题,具体流程如下:这里的关键逻辑是:非对称加密(如RSA、ECDHE)的特点是“公钥加密、私钥解密”,安全性高但运算速度慢,因此仅用于传输“会话密钥”;对称加密运算速度快,适合海量数据的加密传输,二者结合既保证了安全性,又兼顾了原创 2025-12-25 08:34:27 · 796 阅读 · 0 评论 -
美团ios开发社会招聘面试题及参考答案
/ 存储相邻节点(有向边)// 双向链表节点// LRU缓存类private let capacity: Int // 缓存容量private var cache: [Int: ListNode] // 哈希表:key→节点private let dummyHead: ListNode // 虚拟头节点(简化边界处理)private let dummyTail: ListNode // 虚拟尾节点(简化边界处理)定义:一棵深度为h的二叉树,所有层的节点数均达到该层的最大值。原创 2025-12-25 10:53:06 · 2532 阅读 · 0 评论 -
小红书ios开发面试题及参考答案
/ 结构体中的存储属性// 变量存储属性(可修改)var speed: Double = 0.0 // 带默认值// 常量存储属性(不可修改)// 构造器赋值self.carID = id // 常量存储属性在构造器中赋值// 使用存储属性var myCar = Car(brand: "特斯拉", id: "TSL1001")myCar.speed = 120.0 // 修改变量存储属性print(myCar.brand) // 读取存储属性,输出 特斯拉。原创 2025-12-26 09:22:10 · 629 阅读 · 0 评论 -
得物ios开发面试题及参考答案(上)
互斥锁(Mutual Exclusion Lock):核心是 “独占式访问”,确保同一时间只有一个线程能进入临界区(操作共享资源),其他线程需等待锁释放后才能进入。本质是 “悲观锁” 思想(假设存在并发冲突,提前通过锁限制访问)。NSLock、GCD 信号量(,信号量值设为 1 时等价于互斥锁)。非互斥锁(Non-Mutual Exclusion Lock):不强制临界区独占访问,允许多个线程同时进入临界区,或通过 “弱同步” 规则(如顺序控制、条件触发)实现同步,不直接限制并发访问。原创 2025-12-20 11:04:32 · 603 阅读 · 0 评论 -
虎牙ios开发面试题及参考答案(上)
循环引用(Retain Cycle)是 Objective-C 开发中最常见的内存泄漏原因,指两个或多个对象之间相互强引用(strong reference),形成闭环,导致所有对象的引用计数无法减为 0,即使不再使用也无法被系统回收,长期占用内存,最终可能导致应用卡顿、崩溃。理解循环引用的产生场景和避免方法,是 iOS 开发者必备的内存管理能力。一、什么是循环引用?(原理与示例)原创 2025-12-17 07:16:45 · 892 阅读 · 0 评论 -
从入门到架构:一套小白也能看懂的 iOS 自动化内存泄漏监控方案(附 MLeaksFinder 实战)
在 Swift 里,Protocol 默认是可以被 Struct(结构体)和 Class(类)共同遵守的。// 这种写法是很多人的习惯// 坑就在这!编译器不让你加 weak,因为 protocol 没限制 class因为没被限制为AnyObject(或老版本的class),编译器不知道遵守它的是引用类型还是值类型,所以它禁止你用weak修饰。于是,很多开发者图省事,直接把weak去掉了。CustomView强引用delegate(通常是 VC)。VC强引用CustomView。原创 2025-12-14 20:07:28 · 678 阅读 · 0 评论 -
从 2.5% 到 0.1%:一名资深 iOS 架构师的“崩溃治理”复盘笔记
这个错误简直是 iOS 开发者的噩梦。通常是因为:类型转换错误(把当成了NSArray用)。Delegate 没清理,指到了错误的对象上。后端返回数据结构变更,解析错乱。动态方法解析备用接收者完整消息转发如果三次机会都浪费了,才会抛出异常导致崩溃。我们要抓住第二次机会。因为这一步消耗最小,且最容易控制。原创 2025-12-16 14:27:13 · 642 阅读 · 0 评论 -
猫眼ios开发面试题及参考答案(下)
单链表节点:// 仅后继指针@end双链表节点:// 前驱指针// 后继指针@end// 数据域// 后继指针@end@end二叉树的前序、中序、后序遍历是三种基础的深度优先遍历(DFS)方式,核心差异在于“访问根节点的时机”——前序(根→左→右)、中序(左→根→右)、后序(左→右→根),“前、中、后”均针对根节点的访问顺序而言。遍历的核心目标是按特定顺序访问二叉树的所有节点,且每个节点仅访问一次。原创 2025-12-14 07:42:47 · 162 阅读 · 0 评论 -
实战救火型 从 500MB 降到 50MB:高频业务场景下的 iOS 内存急救与避坑指南
如果你频繁 Push/Pop 这个页面,而系统回收内存的速度赶不上你创建的速度(内存碎片化),App 就会因为瞬时内存峰值过高被杀掉。别指望 SDWebImage 的 Cache 帮你管理一切,它的 Cache 是基于 LRU 的,但在高频交互下,LRU 可能还没来得及淘汰,内存就已经爆了。但是像我上面说的“大图没释放”、“缓存无限增长”,它们之间是有强引用的,不是循环引用,所以 Leaks 工具觉得它们是“合法”的。如果说 Block 循环引用是显性的坑,那定时器(Timer)就是隐形的杀手。原创 2025-12-12 00:05:18 · 888 阅读 · 0 评论 -
别再背八股文了:资深架构师眼里的 RunLoop、GCD 与线程保活真相
用一个。原创 2025-12-13 16:48:53 · 730 阅读 · 0 评论 -
猫眼ios开发面试题及参考答案(上)
OC 中的 Category(中文常称“类别”或“分类”)是一种灵活的类扩展机制,允许在不修改类的原始实现文件(.h.m)、不创建子类的前提下,为已存在的类(包括系统类,如NSStringUIView)添加新的方法、协议,或重写类的部分方法(不推荐重写系统方法)。其核心价值是“解耦代码、扩展功能、模块化管理”,具体作用如下:扩展系统类功能:系统类(如NSString)无法直接修改源码,通过 Category 可添加自定义方法。例如,为NSString// 新增方法@end@end。原创 2025-12-13 21:23:32 · 430 阅读 · 0 评论 -
搜狐ios开发面试题及参考答案
一、核心现象:数据类型强制转换导致精度丢失当用 assign 修饰 int 类型变量。原创 2025-12-11 00:07:29 · 643 阅读 · 0 评论
分享