• iOS技术面试01:多线程与网络


    1. 多线程的底层实现?

    1> 首先搞清楚什么是线程、什么是多线程、多线程的使用场合(线程有时被称为轻量级进程,是程序执行流的最小单元。多线程是指软件或者硬件实现多个线程并发执行的技术。多线程的使用场合:1程序包含复杂的计算任务;2处理速度较慢的外围设备;3程序设计自身的需要)

    2> Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程3> 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的(如果面试官问还有ma再回答这个)

    4> 开发中实现多线程的方案:

    l C语言的POSIX接口:#include <pthread.h>

    l OCNSThread

    l C语言的GCD接口(性能最好,代码更精简)

    l OCNSOperationNSOperationQueue(基于GCD

     

    2.线程间怎么通信?

    1> GCD

    2> performSelector:onThread:withObject:waitUntilDone:

       performSelectorOnMainThread:withObject:waitUntilDone:

    3> NSMachPort(可选)

     

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

    // 创建队列

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

     

    // 创建3个操作

    NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@”operation1---“);

    }];

    NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@”operation1---“);

    }];

    NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{

    NSLog(@”operation1---“);

    }];

     

    // 添加依赖

    [c addDependency:a];

    [c addDependency:b];

     

    // 执行操作

    [queue addOperation:a];

    [queue addOperation:b];

    [queue addOperation:c];

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

    NSThread;GCD;NSOperation.

    1> 只在主线程刷新访问UI

    2> 如果要防止资源抢夺,得用synchronized进行加锁保护

    3> 如果异步操作要保证线程安全等问题尽量使用GCD

     

    6GCD内部怎么实现的

    1> iOSOS X的核心是XNU内核,GCD是基于XNU内核实现的

    2> GCDAPI全部在libdispatch库中

    3> GCD的底层实现主要有Dispatch Queue和Dispatch Source

    l Dispatch Queue :管理block(操作)

    l Dispatch Source :处理事件(比如线程间的通信)

     

    (1GCD的一个重要概念是队列,它的核心理念:将长期运行的任务拆分成多个工作单元,并将这些单元添加到dispath queue中,系统会为我们管理这些dispath queue,

    为我们在多个线程上执行工作单元,我们不需要直接启动和管理后台线程。

    2 系统提供了许多预定义的dispath queue,包括可以保证始终在主线程上执行工作的dispath queue,

    也可以创建自己的dispath queue,而且可以创建任意多个,GCD的dispath queue严格遵循FIFO(先进先出)原则,

    添加到dispath queue的工作单元将始终按照加入dispath queue的顺序启动。
    3.dispatch queue按先进先出的顺序,串行或并发地执行任务
    1> serial dispatch queue一次只能执行一个任务, 当前任务完成才开始出列并启动下一个任务
    2> concurrent dispatch queue则尽可能多地启动任务并发执行)

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

    1> GCD是纯C语言的APINSOperationQueue是基于GCDOC版本封装

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

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

    4> NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld

    5> GCD的执行速度比NSOperationQueue

     

    8. 既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?blockARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?

    Block的使用注意:

    1> block的内存管理

    2> 防止循环retian

    l 非ARCMRC):__block

    l ARC__weak\__unsafe_unretained

     

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

    1> 重新下载图片

    2> 下载完毕利用RunLoop的输入源回到主线程刷新UIImageVIUew

  • 相关阅读:
    周末班:Python基础之面向对象基础
    二分查找
    各种推导式合集
    周末班:Python基础之函数进阶
    Python基础之迭代器和生成器
    Django中的信号
    周末班:Python基础之并发编程
    周末班:Python基础之网络编程
    Python基础之面对对象进阶
    Python基础之协程
  • 原文地址:https://www.cnblogs.com/linxiu-0925/p/5031246.html
Copyright © 2020-2023  润新知