作业帮

作业帮

一面:

1.Runtime 和 Runloop 应用,除了OC,还有哪些是动态语言

2.Swift 中 @objc 的作用

3.IM 断线重连,离线消息和在线消息;IM的监听回调的分发,多个页面都需要监听

4.Webp 加载慢

5.跟H5交互 频繁发消息

6.内购,支付成功后,接口返回失败

7.直播 动画,视频插帧,视频动画里的某一帧里新增自定义文字

8.怎么控制依赖库的打包顺序

9.import 尖括号和双引号,为什么尖括号就能找到第三方库的某一个文件,而不用完整路径

10.subspec 除了 dependency 还有哪些

11.移除 armv7 只支持真机吗?一些三方库带 armv7,为了提升打包速度,怎么移除

12.export

13.ipa 包里都有哪些东西

14.接口缓存

15.有没有写过一些脚本,提效的工作

16.js 的单线程和事件循环

算法:

任务并发控制的实现

// tasks 比如100个计算任务

// limit 最多3个

// allDoneCallback 所有任务执行完毕的回调

func excuteTasks(tasks: [func], limit: Int, allDoneCallback: func) {

}

二面:

1.Block 原理,循环引用

2.Runtime 应用,动态更新,为什么 OC 要这么设计?

3.Runloop 应用

4.做过哪些优化

算法:在10000个int数组里,找出最大的 topK 个数

参考答案

1.Runtime 和 Runloop 应用,除了OC,还有哪些是动态语言

2.Swift 中 @objc 的作用

场景 是否需要 @objc 说明
Swift 调用 Swift 无需
Swift 调用 Obj-C Swift 自动桥接
Obj-C 调用 Swift 必须显式 @objc
使用 #selector 否则编译错误
KVO / KVC ✅ @objc dynamic
Method Swizzling ✅ @objc dynamic
响应事件 (UIResponder) 自动添加 UIKit 内部已处理

3.IM 断线重连,离线消息和在线消息;IM的监听回调的分发,多个页面都需要监听

4.Webp 加载慢

5.跟H5交互 频繁发消息

6.内购,支付成功后,接口返回失败

7.直播 动画,视频插帧,视频动画里的某一帧里新增自定义文字

8.怎么控制依赖库的打包顺序

9.import 尖括号和双引号,为什么尖括号就能找到第三方库的某一个文件,而不用完整路径

10.subspec 除了 dependency 还有哪些

11.移除 armv7 只支持真机吗?一些三方库带 armv7,为了提升打包速度,怎么移除

1
2
3
4
# 查看包含哪些架构
lipo -info YourLib.framework/YourLib
# 移除 armv7
lipo -remove armv7 YourLib.framework/YourLib -o YourLib.framework/YourLib

12.export

13.ipa 包里都有哪些东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MyApp.ipa
├── Payload/
│ └── MyApp.app/
│ ├── MyApp # 可执行文件
│ ├── Info.plist
│ ├── Assets.car
│ ├── Frameworks/
│ ├── PlugIns/
│ ├── Base.lproj/
│ ├── embedded.mobileprovision
│ └── _CodeSignature/
├── SwiftSupport/ # Swift运行库(可选)
├── WatchKitSupport2/ # Watch支持(可选)
└── META-INF/ # 签名元数据(可选)

14.接口缓存

15.有没有写过一些脚本,提效的工作

打包上传蒲公英平台,切换汉口银行SDK的文件,JSON自动生成模型

16.JS的单线程和事件循环

  1. 执行同步任务(主线程)
  2. 执行所有微任务(Promise、nextTick)
  3. 执行一个宏任务(setTimeout 等)
  4. 重复循环

算法:

任务并发控制的实现

// tasks 比如100个计算任务

// limit 最多3个

// allDoneCallback 所有任务执行完毕的回调

func excuteTasks(tasks: [func], limit: Int, allDoneCallback: func) {

}

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
typedef void (^TaskBlock)(void);
typedef void (^AllDoneBlock)(void);

void executeTasks(NSArray<TaskBlock> *tasks, NSInteger limit, AllDoneBlock allDoneCallback) {
if (tasks.count == 0) {
if (allDoneCallback) allDoneCallback();
return;
}

// 使用 GCD 信号量控制最大并发数
dispatch_semaphore_t semaphore = dispatch_semaphore_create(limit);

// 用于追踪任务完成
dispatch_group_t group = dispatch_group_create();

// 并发队列(可自定义)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

for (TaskBlock task in tasks) {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // 限制并发数

dispatch_group_enter(group);
dispatch_async(queue, ^{
// 执行任务
if (task) {
task();
}
// 任务完成后释放信号量
dispatch_semaphore_signal(semaphore);
dispatch_group_leave(group);
});
}

// 所有任务完成后执行回调
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
if (allDoneCallback) {
allDoneCallback();
}
});
}

二面:

1.Block 原理,循环引用

2.Runtime 应用,动态更新,为什么 OC 要这么设计?

3.Runloop 应用

4.做过哪些优化

算法:在10000个int数组里,找出最大的 topK 个数

Your browser is out-of-date!

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

×