转转

转转

一面:

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
    5
    if ([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
    3
    window.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. 当前待遇 & 期望薪资

建议答法:

  • 当前总包/薪资范围
  • 期望平台成长 + 技术深度 +回报匹配
  • 可接受一定灵活性,但看重发展潜力

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×