一面:
1.活动页组件化,JSON 结构,跳转区分 Scheme 和 HTTP 是谁来处理的?
2.加载速度优化
3.检测无用代码是检测的 mach-o 的无用类还是方法?
4.多个请求完成后通知除了 GCD 还有什么方法?
5.webView 和原生的交互,设计一个监听原生页面声明周期,通知 H5,(有些需要监听,有些不需要监听)
6.webView 加载速度优化,项目里用到的
7.组件化怎么划分的模块,分层
8.内存管理,项目里常见的循环引用,为什么用 NSProxy,和 NSObject 区别
二面:
1.介绍项目亮点
2.设计原生与 Flutter/H5 交互 上中下三层
3.iOS 和 H5 交互方法,优缺点
4.具体规划,目前待遇,offer,期望薪资
参考答案
一面:
1.活动页组件化,JSON 结构,跳转区分 Scheme 和 HTTP 是谁来处理的?
2.加载速度优化
3.检测无用代码是检测的 mach-o 的无用类还是方法?
4.多个请求完成后通知除了 GCD 还有什么方法?
5.webView 和原生的交互,设计一个监听原生页面声明周期,通知 H5,(有些需要监听,有些不需要监听)
6.webView 加载速度优化,项目里用到的
7.组件化怎么划分的模块,分层
(1)Accessories App附属品
Watch、Extension、Widget
(2)Business 业务组件
文库、网盘、性能监控、付费咨询、Feed、搜索等
(3)Interface 接口层
(4)Underlays 服务组件
搜索工具、Feed通用业务,天气通用数据组件等
(5)Services 服务组件
IM、Talos、Performance、UBC、AFX等
(6)Basics 基础组件
BDPDevice、Cocoa(BBAFoundation、BBAUIKit、BDPWindow、BDPAppearance、AFX)、Network
(7)Vendors 三方库
AFNetworking、SDWebImage、YYModel等
8.内存管理,项目里常见的循环引用,为什么用 NSProxy,和 NSObject 区别
NSProxy
主要用于代理和消息转发,它提供了一个机制来实现不直接处理方法调用的对象。NSObject
是所有 Objective-C 对象的基础类,提供了对象管理和通用功能的实现。
通常情况下,如果你需要实现一种代理模式或远程调用,NSProxy
是合适的选择。如果你在创建一个普通的对象,NSObject
是你通常会继承的类。
二面:
1.介绍项目亮点
2.设计原生与 Flutter/H5 交互 上中下三层
3.iOS 和 H5 交互方法,优缺点
4.具体规划,目前待遇,offer,期望薪资
📘 iOS 面试通关手册(组件化 / H5 / 性能 / 架构)
🧩 一面核心题目详解
1. 活动页组件化,JSON 结构,跳转区分 Scheme 和 HTTP 是谁来处理的?
答案要点:
- JSON 描述跳转目标(如 URL、pageId、params)
RouterManager
/Navigator
统一解析 URL,决定打开方式:1
2
3
4
5if ([url.scheme isEqualToString:@"http"] || [url.scheme isEqualToString:@"https"]) {
// 打开 WebView
} else if ([url.scheme isEqualToString:@"app"]) {
// 原生跳转
}分离跳转逻辑与页面结构,便于动态配置与热更新。
2. 加载速度优化
优化方式:
- 首屏优化:异步加载、骨架屏占位、按需加载
- 图片优化:压缩、缓存(SDWebImage)、懒加载
- 数据优化:合并请求、接口聚合、GZIP 压缩
- 离线缓存:预加载 HTML、JS Bundle、资源包
- 网络优化:HTTP2、多路复用、CDN 配置
3. 检测无用代码是检测 Mach-O 的类还是方法?
答法:
- 都可以,通过静态分析:
LinkMap
文件分析未被引用的符号Clang 插桩
、Swift Demangle
查看未调用的方法
- Mach-O 是最终产物,反映“未被链接进二进制”的部分
4. 多请求完成通知除了 GCD,还有什么?
方案:
NSOperationQueue + addDependency
- Promise/Future:PromiseKit、Combine、RxSwift
- KVO 监听属性变化,触发 UI 更新
- Dispatch Semaphore:手动控制信号
5. WebView 与原生交互,监听页面生命周期通知 H5
设计:
原生页面生命周期调用 JS 通知:
1
[webView evaluateJavaScript:@"window.onNativeLifeCycle('viewDidAppear')"]
JS 注册:
1
2
3window.onNativeLifeCycle = function(state) {
if (state === 'viewDidAppear') { /* 处理 */ }
}可配置控制哪些生命周期需要同步(如通过 JSBridge 参数指定)
6. WebView 加载速度优化(项目中用到的)
方法:
- 离线资源包(JS/CSS/HTML)打包在本地
- WKWebView 复用池(WebViewPool)减少初始化开销
- 设置 cachePolicy,合理使用缓存
- 禁用插件(如 JS 插件、自动检测)提高启动速度
7. 组件化怎么划分模块 / 分层?
推荐结构:
- Base 层:网络、工具类、日志、配置
- UI 层:通用 UI 组件(按钮、卡片、弹窗)
- Biz 层:独立业务模块(登录、支付、商城)
- Service 层:统一服务(埋点、权限、推送)
- Protocol 层:各模块之间解耦协议
关键词: 解耦、高内聚、低耦合、模块隔离、可热更新
8. 内存管理:循环引用、NSProxy 与 NSObject 区别
常见循环引用:
- Timer 持有控制器
- Block 捕获 self
- delegate 强引用
NSProxy 使用:
- 中转代理(如 NSTimer):
1
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:[WeakProxy proxyWithTarget:self] selector:@selector(run) userInfo:nil repeats:YES];
与 NSObject 区别:
- NSProxy 是消息转发专用,不继承 NSObject,无默认行为
- NSObject 有默认的内存管理 / KVO / 响应链
🚀 二面核心题目详解
1. 项目亮点介绍
答题建议:
- 选一个“有挑战/成果”的模块深入讲:
- 比如:活动页组件化、加载优化、自研 Bridge 桥接方案
- 体现技术落地、团队协作、提效效果
2. 原生与 Flutter/H5 交互设计(上下三层)
三层架构:
- 上层:业务 API(login、pay、share)
- 中层:Bridge 协议定义、参数统一封装(JSON)
- 底层:Native 实现,JS 调用处理、回调、权限判断等
3. iOS 与 H5 交互方法及优缺点
方法 | 优点 | 缺点 |
---|---|---|
evaluateJavaScript |
简单直接 | 无回调、不安全 |
WKScriptMessageHandler |
安全规范、结构清晰 | 配置繁琐,不适合高频交互 |
URL Scheme 拦截 | 通用性强 | 参数受限、安全差 |
4. 当前待遇 & 期望薪资
建议答法:
- 当前总包/薪资范围
- 期望平台成长 + 技术深度 +回报匹配
- 可接受一定灵活性,但看重发展潜力