ios多线程

ios 面试题之多线程死锁

牧云@^-^@ 提交于 2019-12-01 01:36:48
死锁 死锁就是队列引起的循环等待 1、一个比较常见的死锁例子:主队列同步 - (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"deallock"); }); // Do any additional setup after loading the view, typically from a nib. } 在主线程中运用主队列同步,也就是把任务放到了主线程的队列中。 同步对于任务是立刻执行的,那么当把任务放进主队列时,它就会立马执行,只有执行完这个任务,viewDidLoad才会继续向下执行。 而viewDidLoad和任务都是在主队列上的,由于队列的先进先出原则,任务又需等待viewDidLoad执行完毕后才能继续执行,viewDidLoad和这个任务就形成了相互循环等待,就造成了死锁。 想避免这种死锁,可以将同步改成异步dispatch_async,或者将dispatch_get_main_queue换成其他串行或并行队列,都可以解决。 2、同样,下边的代码也会造成死锁: dispatch_queue_t serialQueue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);

ios 面试题之多线程死锁

拈花ヽ惹草 提交于 2019-12-01 01:35:12
/*--> */ /*--> */ ###### 十、 死锁 死锁就是队列引起的循环等待 ** 1、一个比较常见的死锁例子:主队列同步 ** ``` - (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"deallock"); }); // Do any additional setup after loading the view, typically from a nib. } ``` 在主线程中运用主队列同步,也就是把任务放到了主线程的队列中。 同步对于任务是立刻执行的,那么当把任务放进主队列时,它就会立马执行,只有执行完这个任务,viewDidLoad才会继续向下执行。 而viewDidLoad和任务都是在主队列上的,由于队列的先进先出原则,任务又需等待viewDidLoad执行完毕后才能继续执行,viewDidLoad和这个任务就形成了相互循环等待,就造成了死锁。 想避免这种死锁,可以将同步改成异步dispatch_async,或者将dispatch_get_main_queue换成其他串行或并行队列,都可以解决。 ** 2、同样,下边的代码也会造成死锁: ** ``` dispatch_queue_t serialQueue =

iOS多线程编程的知识梳理

[亡魂溺海] 提交于 2019-11-28 22:58:13
多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐。在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如AFNetworking进行网络请求比较简单,但是也是需要开发人员对多线程、block等知识有比较清晰的思路,才能在遇到问题的时候,能够有条理的找出问题并解决好。 本篇文章的定位是梳理下在iOS开发中多线程的知识,也算是一个提纲,一来可以在学习或者是回顾多线程知识时候有个导向,二来也可以作为自己对多线程知识的一个检测,看自己是否能够根据这个提纲,做精细化加工。 在iOS开发中,我认为主要是三个方面的知识要非常清楚: (一)多线程相关的知识 (二)GCD的使用 (三)NSOperation的使用 首先是,多线程相关的知识 (一)三者之间的关系:进程、线程、任务 (二)引入多线程技术:概念、原理、优缺点、应用场景 (三)线程中的任务执行是串行 (四)实现多线程的技术:pthread、NSThread、GCD、NSOperation (五)线程的相关操作:创建、启动、运行、阻塞、销毁 (六)线程间的相关操作:数据共享、线程之间的通信 (七)关于线程的相关术语:主线程、子线程 然后是,GCD的使用 (一)在GCD中有两个概念需要明确:函数、队列 (二)两种函数:同步函数--在当前线程中执行任务

iOS面试题

淺唱寂寞╮ 提交于 2019-11-27 09:37:51
文章转载自: http://www.pythonheidong.com/blog/article/3327/ iOS面试题 1. Difference between shallow copy and deep copy? 浅复制和深复制的区别? 浅层复制:指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。 2.What is advantage of categories? What is difference between implementing a category and inheritance? 类别的作用?继承和类别在实现中有何区别? category可以在不熟悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。 (2)创建对私有方法的前向引用。 (3)向对象添加非正式协议。 继承可以添加,修改或删除方法,并且可以增加属性。 3.Difference between categories and extensions? 类别和类扩展的区别。 categories和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。

iOS面试题总结

点点圈 提交于 2019-11-26 17:18:50
1. 多线程的底层实现? 1. 首先搞清楚什么是线程、什么是多线程 2. Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程 3. 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的 4. 开发中实现多线程的方案 C语言的POSIX接口:#include <pthread.h> OC的NSThread C语言的GCD接口(性能最好,代码更精简) OC的NSOperation和NSOperationQueue(基于GCD) 2. 线程间怎么通信? 1. performSelector:onThread:withObject:waitUntilDone: 2. NSMachPort 3. 网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题? 利用字典(图片地址为key,下载操作为value),具体可以查看SD缓存机制 4. 用NSOpertion和NSOpertionQueue处理A,B,C三个线程,要求执行完A,B后才能执行C,怎么做? NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSOperation *A = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@