美文网首页
关于gcd的一道面试题

关于gcd的一道面试题

作者: 奋斗的小马达 | 来源:发表于2021-09-28 11:39 被阅读0次

1、下面代码打印结果

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    dispatch_queue_t queu = dispatch_get_global_queue(0, 0);
    dispatch_async(queu, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0.0];
        NSLog(@"3");
    });
}

- (void)test {
    NSLog(@"2");
}

答案:1、3

解析:

[self performSelector:@selector(test) withObject:nil afterDelay:0.0];
这段代码的本质是往runloop中添加定时器 但是子线程的runloop并没有开启
所以当还未等到定时器开始工作 子线程就已经销毁了

2、下面代码打印结果

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    dispatch_queue_t queu = dispatch_get_global_queue(0, 0);
    dispatch_async(queu, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil];
        NSLog(@"3");
    });
}

- (void)test {
    NSLog(@"2");
}

答案:1、2、3

解析:

[self performSelector:@selector(test) withObject:nil];
本质就是:objc_msgSend  代码和 [self test] 本质一样
所以打印结果是:1、2、3

3、下面代码打印结果

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    dispatch_queue_t queu = dispatch_get_global_queue(0, 0);
    dispatch_sync(queu, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0.0];
        NSLog(@"3");
    });
}

- (void)test {
    NSLog(@"2");
}

答案:1,3,2

解析:

dispatch_sync 同步执行 所以此时GCD并没有开启新的线程
又由于[self performSelector:@selector(test) withObject:nil afterDelay:0.0];
是开启了定时器,所以runloop在走第一圈的时候的顺序是
 NSLog(@"1")、开启定时器、  NSLog(@"3"); 
然后定时器开始执行 因此又走了    NSLog(@"2");
所以打印结果是:1、3、2




相关文章

  • 关于gcd的一道面试题

    1、下面代码打印结果 答案:1、3 解析: 2、下面代码打印结果 答案:1、2、3 解析: 3、下面代码打印结果 ...

  • 笔记 - 多线程之GCD

    目录 概念 常用API的使用 关于GCD的面试题 一、概念 1.1、什么是GCD? 定义想执行的任务,并追加到适当...

  • iOS - GCD

    目录 GCD简介 GCD核心概念 GCD队列的使用 GCD的常见面试题 GCD简介 Grand Central D...

  • OC多线程学习(二) - GCD

    本文内容: GCD相关概念 有关GCD的几道面试题 源码分析:队列和异步函数 GCD概念 GCD是Grand Ce...

  • 这道 Integer 的题一定要会

    一道关于 Integer 的面试题居然难倒了我

  • 关于GCD的面试题。

    写在前面,先说下几个常识:1、同步线程不具备开启新线程的能力。异步线程具备开启新线程的能力。2、同步线程立即执行任...

  • iOS经典面试题

    一、isKindOfClass和isMemberOfClass 题目: 有一道经典面试题关于isKindOfCla...

  • 木叶大旋风之横扫面试(iOS面试题系列)

    一、isKindOfClass和isMemberOfClass 题目: 有一道经典面试题关于isKindOfCla...

  • GCD 常见面试点

    在最近的 iOS 面试过程中,GCD 是属于必问的问题,接触过不少 GCD 相关的面试题,有关 GCD 的面试点大...

  • Javascript执行机制(setTimeout/Promis

    遇到的一道关于javascript执行机制的面试题 Javascript执行机制(setTimeout/Promi...

网友评论

      本文标题:关于gcd的一道面试题

      本文链接:https://www.haomeiwen.com/subject/xaglnltx.html