滴滴 IOS客户端-C++ 二面
为什么选择 iOS 客户端方向
我选择 iOS 的核心原因是能直接对用户体验负责,从性能、交互到稳定性都能看到即时反馈。客户端工程同时要求工程化能力和产品理解能力,我喜欢这种“技术深度 + 用户价值”结合的方向。iOS 生态对质量要求高,也更适合长期沉淀架构和性能优化能力。
Objective-C 的特点
Objective-C 是在 C 语言基础上加入面向对象与消息机制的语言,运行时特性非常强。它的消息发送是动态绑定,支持反射、方法交换、动态添加方法等机制,适合做灵活扩展。语法上兼容 C,历史包袱较重但生态成熟,尤其在老项目和运行时相关能力上依然重要。
一般如何学习 Objective-C
按“语法 -> Runtime -> 工程实践”三层推进。先掌握对象模型、内存管理、分类协议等基础,再深入 Runtime 与消息转发,最后通过真实业务代码理解架构和调优。学习时会结合调试工具看对象生命周期和调用链,而不是只背概念。
你的英语水平怎么样
当时回答过了4 6级 能看懂英文文档 , 让我用英语做了一段自我介绍
实习经历拷打
这个根据个人情况自己回答了
解决 TP 初始化失败问题
典型处理思路是先确认失败发生在时序、依赖未就绪还是硬件通信异常。然后做分层日志和错误码归一化,保证能区分“偶现失败”和“必现失败”。工程上会加入初始化状态机、超时与重试机制、兜底降级路径,并把初始化前置依赖显式化,避免隐式竞态。
class 和 struct 的区别(C++)
在 C++ 中两者本质几乎相同,主要默认权限不同:class 默认 private,struct 默认 public。两者都支持成员函数、继承、模板等完整能力。工程上一般用 struct 表示轻量数据聚合,用 class 表示有封装和不变量约束的对象。
C++ 常用容器
常用容器包括顺序容器 vector、deque、list,关联容器 map/set,无序关联容器 unordered_map/unordered_set,以及适配器 stack/queue/priority_queue。选择核心是访问模式、是否有序、插删位置和内存开销。
这些容器应用场景
vector 适合高频遍历和尾部追加;deque 适合头尾都要高效操作;list 适合中间插删频繁但不适合随机访问。 map/set 用于有序和范围查询,unordered_map/set 用于高频点查。 priority_queue 适合 TopK,queue 适合 BFS 和任务流,stack 适合括号匹配与回溯状态管理。
深拷贝和浅拷贝
浅拷贝只复制对象表层字段,指针成员会共享同一块堆内存;深拷贝会复制指针所指向的资源,得到独立副本。浅拷贝快但易出现双重释放或联动修改,深拷贝安全但成本更高。带资源所有权的类型必须明确拷贝语义,现代 C++ 常用移动语义减少深拷贝成本。
解释图片里的 Objective-C 代码
这类题目通用方法是先判断对象类型和内存语义,再看消息发送和运行时分发,最后结合 copy/mutableCopy、属性修饰符和 block 捕获规则推导输出。若涉及分类、KVC/KVO 或方法交换,要优先检查是否改写了实际调用路径。输出题本质在考对象生命周期与动态派发理解。
OC 中 mutableCopy 和 copy 的区别
copy 通常返回不可变对象;对不可变对象做 copy 往往是浅复制(可能返回同一对象)。mutableCopy 会返回可变对象,通常会产生新对象。容器和字符串上最常考这一点:NSString 的 copy 仍是不可变,mutableCopy 得到 NSMutableString。
property 的属性有哪些
常见属性有读写控制 readonly/readwrite,内存语义 strong/weak/assign/copy,原子性 atomic/nonatomic,以及访问器命名 getter/setter。对象类型通常在 ARC 下用 strong/weak/copy;copy 常用于 NSString、NSArray、block 这类需要防止外部可变性污染的场景。iOS 实战里大多使用 nonatomic 以减少锁开销。
给一段 OC 代码说输出结果(答题原则)
先看是否涉及 +load/+initialize、属性 setter/getter 重写、分类同名方法覆盖、block 捕获、以及 RunLoop/异步调度。再按“编译期绑定 vs 运行时消息发送”判断实际执行函数。最后结合对象可变性与引用关系推导最终打印。输出题不怕慢,怕跳步骤。
什么情况下会死锁
死锁四要素是互斥、占有且等待、不可抢占、循环等待,同时满足就可能发生。iOS 常见场景是串行队列里同步派发到同一队列,或多个锁加锁顺序不一致导致循环等待。规避方法是统一锁顺序、减少嵌套锁、避免在主线程做阻塞等待。
HTTP 状态码有哪些
可按类别记忆:1xx 信息响应,2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务端错误。高频要熟的是 200、201、204、301/302、304、400、401、403、404、429、500、502、503、504。面试回答时给分类 + 常见码 + 典型场景即可。
TCP 和 UDP 的区别
TCP 面向连接、可靠、有序、字节流传输,具备重传、流控、拥塞控制,适合对正确性要求高的场景。UDP 无连接、尽力而为、面向报文,时延低、开销小,适合实时音视频、DNS、游戏等容忍少量丢包的场景。简单说:TCP 要“准”,UDP 要“快”。
如何在 10 亿个整数中找出前 1000 个最大数
这题标准解是维护大小为 1000 的最小堆。先放入前 1000 个元素建堆,之后每读到一个新数,如果大于堆顶就替换堆顶并下沉,最后堆中即为前 1000 大。时间复杂度 O(n log k),这里 k=1000,空间复杂度 O(k),适合海量流式数据。
#include <vector>
#include <queue>
using namespace std;
vector<int> topK(const vector<int>& nums, int k = 1000) {
priority_queue<int, vector<int>, greater<int>> minHeap;
for (int x : nums) {
if ((int)minHeap.size() < k) {
minHeap.push(x);
} else if (x > minHeap.top()) {
minHeap.pop();
minHeap.push(x);
}
}
vector<int> ans;
ans.reserve(minHeap.size());
while (!minHeap.empty()) {
ans.push_back(minHeap.top());
minHeap.pop();
}
return ans; // 若需降序可再 sort(ans.rbegin(), ans.rend())
}
本专栏系统梳理C++面试高频考点,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力。

查看1道真题和解析