高级iOS面试题全纪录

iOS基础:

  1. 多线程使用,gcd跟operation区别,怎么取消正在执行的gcd任务
  • GCD 系列知识总结
  • NSOperation相关知识总结
  • 可以仿照operation的工作原理,设置一个BOOL变量,当需要停止时设置成YES,执行任务的时候去判断这个状态
  • 使用带来的问题:资源竞争、优先倒置、死锁
  1. 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模式,就可以解决这个问题了。
  • 重任务分散,比如批量大图加载。
  1. 自动释放池工作原理
    AutoreleasePool的原理和实现
  2. 响应链原理
  • iOS事件响应链中Hit-Test View的应用
- (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;
}
  • 扩大按钮点击范围
  • 修改响应视图
  • 让超出父视图的子视图响应操作
  1. 自动打包技术
  • 持续集成开发:Jenkins自动打包实践
  1. 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便会执行。之后队列便恢复正常执行。

  1. 多线程中的锁使用,要是你你怎么实现
  • iOS开发中的11种锁以及性能对比
  • iOS开发中的各种锁

网络相关:

  1. https请求流程,哪一步有可能被攻破
  2. tcp,udp协议

数据结构:

  1. 数组、字典底层实现

开放性问题:

  1. 你的优势是什么
  2. 你们公司做的最好的是哪一块
  3. 组建化做了吗,路由要是你设计你怎么设计,每种设计的优缺点
  • openUrl的方式 {scheme}://{module}/{page}?{para1=1¶2=2 ... }
  1. RN有了解吗?你们公司为什么不用RN,原因是什么
  2. 要是你入职能为我们公司带来哪些改变
  3. 最近在看什么书,以后职业规划?
  4. 你有什么问题问我吗?

最后附上浏览的其他面试心得:

  1. 2017年iOS面试题总结
  2. 2017年5月iOS招人心得(附面试题)

你可能感兴趣的:(高级iOS面试题全纪录)