美文网首页iOS面试题iOS精品文章-面试iOS面试题整理
iOS面试题锦集(一)——多线程网络

iOS面试题锦集(一)——多线程网络

作者: KyneChen | 来源:发表于2016-09-04 08:54 被阅读970次

    1. 多线程的底层实现?

    • 首先搞清楚什么是线程、什么是多线程;
    • Mach(国际发音:[mʌk])是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程;
    • 开发中很少使用Mach级别的线程,因为Mach级别的线程没有提供线程的基本特征,线程之间是独立的;
    • 开发中实现多线程方案:
      • C语言的POSIX接口:#include <pthread.h>
      • OC语言的NSThread
      • OC语言的GCD接口(性能最好,代码更精确
      • OC语言的NSOperationNSOperationQueue(基于GCD)

    2. 线程间怎么通信?

    • performSelector:onThread:withObject:waitUntilDone:
    • NSMachPort

    3. 网络图片处理问题中怎么解决一个相同的网络地址重复请求问题?

    • 利用字典(图片地址为 key,下载操作为 value

    4. 用NSOpertion和NSOpertionQueue处理A、B、C三个线程,要求执行完A、B后才能执行C,怎么做?

    //1. 创建队列
    NSOperationQueue *queue = [[NSOpertionQueue alloc] init];
        
    //2. 创建3个操作
    NSOperation *a = [NSOperation blockOperationWithBlock:^{
    NSLog(@"operation---");
    }];
    NSOperation *b = [NSOperation blockOperationWithBlock:^{
    NSLog(@"operation---");
    }];
    NSOperation *c = [NSOperation blockOperationWithBlock:^{
    NSLog(@"operation---");
    }];
        
    //3. 添加依赖
    [c addDependency:a];
    [c addDependency:b];
        
    //4. 执行操作
    [queue addOperation:a];
    [queue addOperation:b];
    [queue addOperation:c];
    
    

    5. 列举cocoa中常见的几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?

    • 只在主线程刷新访问UI;
    • 如果要防止资源抢夺,得用synchronized进行加锁保护;
    • 如果异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的。)

    6. GCD 内部怎么实现的?

    • iOS和OS X的核心是XNU,GCD是基于XNU内核实现的;
    • GCD的API全部在libdispatch库中;
    • GCD的底层实现主要有Dispatch QueueDispatch Source
      • Dispatch Queue:管理block(操作)
      • Dispatch Source:处理事件

    7. 你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。

    • GCD是纯C语言的API,NSOPerationQueue是基于GCD的OC版本的封装;

    • GCD只支持FIFO的队列,NSOPerationQueue可以很方便的调整执行顺序、设置最大并发数量;

    • NSOPerationQueue可以轻松在Operation间设置依赖关系,而GCD需要写很多的代码才能实现;

    • NSOperationQueue支持KVO,可以检测operation是否正在执行(isExecuted)、是否结束(isFinished)、是否取消(isCanceled);

    • GCD的执行速度比NSOperationQueue快

      适用范围:

      • 任务之间不太相互依赖:GCD
      • 任务之间有依赖或者要监听任务的执行情况:NSOperationQueue

    8. 上题提到GCD,那么在使用GCD以及block时要注意些什么?它们俩是一回事吗?block在ARC中和传统的MRC中的行为和用法有没有什么区别?需要注意些什么?

    Block的使用注意:

    • block的内存管理;
    • 防止循环retian;
    • 非ARC(MRC):_block;
    • ARC:_weak\ _unsafe _unretained

    9. 在异步线程中下载很多图片,如果失败了,该如何处理?请结合RunLoop来谈谈解决方案。(提示:在异步线程中启动一个RunLoop重新发送网络请求,下载图片。)

    • 重新下载图片;
    • 下载完毕,利用RunLoop的输入源回到主线程刷新UIImageView

    相关文章

      网友评论

        本文标题:iOS面试题锦集(一)——多线程网络

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