京东

京东

一面:

1.SDK 体积优化

2.组件化

3.端到端监控,具体实现

4.YYModel 的实现原理,和 MJExtension 区别,为什么比 MJExtension 快?

5.OOM 怎么排查

6.Facebook 出的异步渲染框架 AsyncDisplayKit 原理

7.样式字段很多,怎么和逻辑字段分开下发?

8.跨端方案,Talos lite

9.怎么提升代码质量

10.设计模式:策略模式、中介者模式

11.打点 cell 50%展现时打点

打点规范,怎么快速找到某一个页面的所有点击点位

12.产品上的业务指标

13.读写安全,除了加锁还有哪些方法

14.算法:实现一个列表,复用,不卡顿,cell 上是多个文本

二面:

1.Flutter 与 iOS 交互方法?

2.Flutter 的 UI 层在哪儿?RN 是原生控件

3.组件化的 Router 里的映射表什么时候生成?

4.JSBridge 原理,前端 JS 有哪些异步方法?前端有哪些存储方法,localstorage有大小限制吗?

5.iOS 打包流程,命令 Xcode build;Cocoapods 打包出来的第三方库是什么形式的?源码还是二进制?.a和.framework 有什么区别?

6.接口监控

7.为什么用到动态库,动态库类型是什么 so?

8.加载速度优化

9.SDK 体积优化

10.RN 的原理,怎么转成了原生控件?了解哪些动态化的方案?Weex、小程序等的区别

11.了解哪些性能优化,滑动流畅性的指标

12.深拷贝和浅拷贝的区别

13.App 启动流程,优化手段,main函数有哪些优化地方

14.发一个 Post 请求,怎么加快速度?Get 和 Post 请求区别,Get 可以将参数放在请求体吗?

15.触摸屏幕流程

16.Swift 中 Class 和 Struct 区别,Struct 可以继承吗?

17.堆和栈的区别

18.内存 isa

19.绘制流程

20.加载速度优化,各个阶段耗时有统计吗?网络的耗时在哪块儿?

21.IM 的架构

22.IM 怎么保证消息的顺序

参考答案

一面:

1.SDK体积优化

2.组件化

3.端到端监控,具体实现

4.OOM怎么排查

5.样式字段很多,怎么和逻辑字段分开下发?

6.跨端方案,Talos lite

7.怎么提升代码质量

8.设计模式:策略模式、中介者模式

常见的23种设计模式包括:

  1. 创建型模式
    • 单例模式 (Singleton)
    • 工厂方法模式 (Factory Method)
    • 抽象工厂模式 (Abstract Factory)
    • 建造者模式 (Builder)
    • 原型模式 (Prototype)
  2. 结构型模式
    • 适配器模式 (Adapter)
    • 桥接模式 (Bridge)
    • 组合模式 (Composite)
    • 装饰器模式 (Decorator)
    • 外观模式 (Facade)
    • 享元模式 (Flyweight)
    • 代理模式 (Proxy)
  3. 行为型模式
    • 责任链模式 (Chain of Responsibility)
    • 命令模式 (Command)
    • 解释器模式 (Interpreter)
    • 迭代器模式 (Iterator)
    • 中介者模式 (Mediator)
    • 存储器模式 (Memento)
    • 观察者模式 (Observer)
    • 状态模式 (State)
    • 策略模式 (Strategy)
    • 模板方法模式 (Template Method)
    • 访问者模式 (Visitor)

中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性,属于行为型模式。

中介者模式定义了一个中介对象来封装一系列对象之间的交互。中介者使各对象之间不需要显式地相互引用,从而使其耦合松散,且可以独立地改变它们之间的交互。

策略模式

在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

9.打点 cell 50%展现时打点

可以使用UITableViewscrollViewDidScroll方法来检测cell的可见区域。具体步骤如下:

  1. 设置UITableViewDelegate: 确保你的视图控制器实现了UITableViewDelegate协议,并设置delegate
  2. 计算可见区域: 在scrollViewDidScroll方法中,计算每个cell的可见区域,并检查它是否至少展现了50%。
  3. 打点逻辑: 根据计算结果进行打点操作,例如记录数据或发送网络请求。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#import "ViewController.h"

@interface ViewController () <UITableViewDelegate, UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.delegate = self;
self.tableView.dataSource = self;
}

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 100; // 示例行数
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"Row %ld", (long)indexPath.row];
return cell;
}

#pragma mark - UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSArray<UITableViewCell *> *visibleCells = [self.tableView visibleCells];
CGRect visibleRect;
visibleRect.origin = self.tableView.contentOffset;
visibleRect.size = self.tableView.bounds.size;

for (UITableViewCell *cell in visibleCells) {
CGRect cellRect = [self.tableView convertRect:cell.frame toView:self.tableView.superview];
CGRect intersection = CGRectIntersection(visibleRect, cellRect);
CGFloat intersectionRatio = intersection.size.height / cellRect.size.height;

if (intersectionRatio >= 0.5) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
NSLog(@"Cell at %ld is at least 50%% visible.", (long)indexPath.row);
// 打点逻辑,例如记录或发送请求
}
}
}

@end

说明

  • 计算可见区域:使用convertRect:toView:方法将cell的frame转换到superview的坐标系,然后计算交集区域。
  • 检查比例:判断交集区域的高度与cell的总高度的比例是否大于或等于50%。

这个实现将确保在UITableView滚动时,对每个cell进行检查,并在其至少展现50%时执行打点操作。

打点规范,怎么快速找到某一个页面的所有点击点位

10.产品上的业务指标

11.读写安全,除了加锁还有哪些方法

12.算法:实现一个列表,复用,不卡顿,cell上是多个文本

二面:

1.Flutter 与 iOS 交互方法?

2.Flutter 的 UI 层在哪儿?RN 是原生控件

3.组件化的 Router 里的映射表什么时候生成?

4.JSBridge 原理

5.iOS 打包流程,命令 Xcode build;Cocoapods 打包出来的第三方库是什么形式的?源码还是二进制?.a和.framework 有什么区别?

CocoaPods 打包出来的第三方库可以是源码形式,也可以是二进制形式,取决于库的发布方式。

  1. 源码形式:大多数CocoaPods库以源码形式提供。这意味着CocoaPods会将库的源代码下载到你的项目中,并在构建时编译这些代码。
  2. 二进制形式:一些库提供二进制预编译版本,以减少编译时间和提高构建速度。在这种情况下,CocoaPods会下载预编译的二进制文件,而不是源码。

你可以在Podspec文件中检查库的具体形式,通常在source字段中定义了库的来源。如果是二进制库,Podspec会指定二进制文件的URL和相关配置。

.a.framework是iOS开发中常见的两种二进制文件格式,分别代表静态库和动态库。它们的主要区别如下:

  1. .a(静态库)
    • 打包形式:静态库是一个归档文件,包含了多个编译好的目标文件(.o文件)。
    • 链接方式:在编译时,静态库的代码会被直接链接到应用程序中。每次构建时,库的代码会被复制到最终的可执行文件中。
    • 更新:如果静态库的代码有更新,必须重新编译整个应用程序。
    • 体积:由于代码被复制到应用程序中,最终的应用包可能会较大。
  2. .framework(动态库)
    • 打包形式:动态库是一个文件夹(包),包含库的二进制文件以及相关的资源文件(如头文件和配置文件)。它可以包含多个版本和资源。
    • 链接方式:动态库在运行时被加载到内存中。应用程序在运行时与库链接,而不是在编译时。这样,多个应用程序可以共享同一个动态库。
    • 更新:更新动态库只需替换库文件,不需要重新编译依赖于该库的应用程序。
    • 体积:动态库的使用可以减少最终应用程序的体积,因为库的代码和资源在运行时被共享和加载。

简而言之,.a是静态库,编译时直接包含在应用中;.framework是动态库,在运行时动态加载和共享。

6.接口监控

7.为什么用到动态库,动态库类型是什么 so?

8.加载速度优化

9.SDK 体积优化

10.RN 的原理,怎么转成了原生控件?了解哪些动态化的方案?Weex、小程序等的区别

11.了解哪些性能优化,滑动流畅性的指标

12.深拷贝和浅拷贝的区别

13.App 启动流程,优化手段,main函数有哪些优化地方

14.发一个 Post 请求,怎么加快速度?Get 和 Post 请求区别,Get 可以将参数放在请求体吗?

15.触摸屏幕流程

16.Swift 中 Class 和 Struct 区别,Struct 可以继承吗?

17.堆和栈的区别

18.内存 isa

19.绘制流程

20.加载速度优化,各个阶段耗时有统计吗?网络的耗时在哪块儿?

21.IM 的架构

22.IM 怎么保证消息的顺序

Your browser is out-of-date!

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

×