高级iOS面试题全纪录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zyzxrj/article/details/82314784

iOS基础:

1.多线程使用,gcd跟operation区别,怎么取消正在执行的gcd任务

2、 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模式,就可以解决这个问题了。
  • 重任务分散,比如批量大图加载。

4、 自动释放池工作原理

5、响应链原理

- (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;
}
  • 扩大按钮点击范围
  • 修改响应视图
  • 让超出父视图的子视图响应操作

6、自动打包技术
- 持续集成开发:Jenkins自动打包实践

7、 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");
        }
    });
}
输出:
任务12并发执行,执行完执行追加追加,再执行任务3

一个dispatch_barrier允许你在一个并行队列中创建一个同步点。当在队列中遇到这个barrier时,这个barrier block便会延迟执行(同时所有在其后的block都会延迟),直至所有在barrier之前的block执行完成。这时,这个barrier block便会执行。之后队列便恢复正常执行。

8、多线程中的锁使用,要是你你怎么实现

网络相关:

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

数据结构:

  1. 数组、字典底层实现

开放性问题:

  • 你的优势是什么
  • 你们公司做的最好的是哪一块
  • 组建化做了吗,路由要是你设计你怎么设计,每种设计的优缺点

  • 列表内容

    1、openUrl的方式 {scheme}://{module}/{page}?{para1=1&para2=2 … }

  • RN有了解吗?你们公司为什么不用RN,原因是什么
  • 要是你入职能为我们公司带来哪些改变
  • 最近在看什么书,以后职业规划?
  • 你有什么问题问我吗?

猜你喜欢

转载自blog.csdn.net/zyzxrj/article/details/82314784
今日推荐