高级iOS面试题全纪录
2018-09-02 本文已影响36人
zyzxrj
iOS基础:
- 多线程使用,gcd跟operation区别,怎么取消正在执行的gcd任务
- GCD 系列知识总结
- NSOperation相关知识总结
- 可以仿照operation的工作原理,设置一个BOOL变量,当需要停止时设置成YES,执行任务的时候去判断这个状态
- 使用带来的问题:资源竞争、优先倒置、死锁
- runtime的使用
- iOS Runtime详解
- swizzling中hook一个方法要先class_addMethod,假如成功class_replaceMethod,失败直接method_exchangeImplementations;这样做的原因是防止本类中没有实现这个方法,即使父类有实现这个方法也不应该替换父类该方法
- 项目中按钮防止连续点击
- 多页面通知的封装
- 归档解档
3.runloop的理解跟应用
- iOS RunLoop详解
- 本质上是一个while循环,一个线程对应一个loop。主线程loop默认开启,子线程要自己手动开启。一个loop钟有多个模式(mode),默认都是default模式。
- 子线程保活,比如在子线程加一个定时器,默认执行一次就不会再执行了
- 假如在主线程加一个定时器去修改UI,当我们滑动界面的时候就会发现UI不变了。因为默认是default模式,滑动界面时切换成响应模式。通过调整成common模式,就可以解决这个问题了。
- 重任务分散,比如批量大图加载。
- 自动释放池工作原理
AutoreleasePool的原理和实现 - 响应链原理
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {
return nil;
}
if ([self pointInside:point withEvent:event]) {//这边point是在self上的位置
for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
CGPoint convertedPoint = [subview convertPoint:point fromView:self];//convertedPoint是subView上的位置
UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];
if (hitTestView) {
return hitTestView;
}
}
return self;
}
return nil;
}
- 扩大按钮点击范围
- 修改响应视图
- 让超出父视图的子视图响应操作
- 自动打包技术
- a,b任务并发执行,然后执行c任务怎么做,有哪些方法实现
- dispatch_group_async(A),dispatch_group_async(B),dispatch_group_notify(C)
- operation设置任务C依赖A,依赖B
- 对C加栅栏
-(void)testBarrier{
dispatch_queue_t osConcurrent = dispatch_queue_create("dyConcurrent1", DISPATCH_QUEUE_CONCURRENT); //自己创建并行队列
dispatch_async(osConcurrent, ^{
for (int i = 0; i< 3; i++) {
NSLog(@"任务1");
}
});
dispatch_async(osConcurrent, ^{
for (int i = 0; i< 3; i++) {
NSLog(@"任务2");
}
});
dispatch_barrier_async(osConcurrent, ^{//这边一定要是自己创建的并行队列,系统global无效
NSLog(@"追加追加追加");
});
dispatch_async(osConcurrent, ^{
for (int i = 0; i< 3; i++) {
NSLog(@"任务3");
}
});
}
输出:
任务1、2并发执行,执行完执行追加追加,再执行任务3
一个dispatch_barrier
允许你在一个并行队列中创建一个同步点。当在队列中遇到这个barrier时,这个barrier block便会延迟执行(同时所有在其后的block都会延迟),直至所有在barrier之前的block执行完成。这时,这个barrier block便会执行。之后队列便恢复正常执行。
- 多线程中的锁使用,要是你你怎么实现
网络相关:
- https请求流程,哪一步有可能被攻破
- tcp,udp协议
数据结构:
- 数组、字典底层实现
开放性问题:
- 你的优势是什么
- 你们公司做的最好的是哪一块
- 组建化做了吗,路由要是你设计你怎么设计,每种设计的优缺点
- openUrl的方式 {scheme}://{module}/{page}?{para1=1¶2=2 ... }
- RN有了解吗?你们公司为什么不用RN,原因是什么
- 要是你入职能为我们公司带来哪些改变
- 最近在看什么书,以后职业规划?
- 你有什么问题问我吗?
最后附上浏览的其他面试心得: