1.
谈谈你对多线程开发的理解?iOS中有几种实现多线程的方法,并说明每种方式有什么特点?
答:使用多线程开发的好处:
1、使用线程可以把程序中占据时间长的任务放到后台去处理,如网络数据的请求、图片、视频的下载 2、发挥多个处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好缺点:1、大量的线程降低代码的可读性 2、更多的线程需要更多的内存空间 3、当多个线程对同一个资源同时进行访问的时候,会出现资源争夺的情况,这个时候要注意线程的安全。1、NSThread(两种创建方式)
优点:NSThread比其他两个轻量级,使用简单。
缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销。
脱离线程: [NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil]; 非脱离线程: NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; [myThread start];2、NSOperationQueue
NSOperationQueue是面向对象的,不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];
- oprationQueue addOperationWithBlock:^{
//这个block语句块在子线程中执行
}
3、
GCD是基于C语言的,苹果开发的一个多核编程的解决方案,iOS4之后才能使用,GCD更接近底层,但是从异步操作之间的事务性、顺序性、依赖关系,GCD需要自己写更多的代码来实现,而NSOperation以及内建了这些支持。dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
PS:不显示的创建线程的方法:
用NSObject的类方法 performSelectorInBackground:withObject: 创建一个线程: [Obj performSelectorInBackground:@selector(doSomething) withObject:nil];
2.
线程与进程的区别和联系?
答:1.线程是CPU独立运行和独立调度的基本单位
进程是资源分配的基本单位
进程和线程都是由操作系统所运行的程序运行的基本单元,
2、区别:
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响
线程只是一个进 程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉
多进程的程序要比多线程的程序健 壮,但在进程切换时,耗费资源较大,效率要差些
对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
3.
简述多线程的作用以及什么地方会用到多线程?OC实现多线程的方法有哪些?谈谈多线程安全问题的几种解 决方案?何为线程同步,如何实现的?分线程回调主线程方法是什么,有什么作用?
答:
(1)、多线程的作用:可以解决负载均衡问题,充分利用cpu资源 。为了提高CPU的使用率,采用多线程的方式去同时完 成几件事情而互不干扰,
(2)、大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文 件、视频图像的采集、处理、显示、保存等。
(3)、ios有三种主要方法:1、NSThread。2、NSOperation。3、GCD。
(4)解决方案:使用锁:锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正 确性。使用POSIX互斥锁;使用NSLock类;使用@synchronized指令等。
(5)回到主线程的方法: dispatch_async(dispatch_get_main_queue(), ^{ });
作用:主线程是显示UI界面,子线程多数是进行数据处理
4.
IOS中如何实现多线程的同步?
答:
一个进程启动的多个不相干线程,它们相互之间关系为异步。
同步的话指的是多线程同时操作一个数据 这个时候需要对数据添加保护 这个保护就是线程的同步。
用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,如果任务1不完成,那么任务2就不会开始,这就是同步
7.
什么是RunLoop?
答: 一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用RunLoop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。runloop的设计是为了减少cpu无谓的空转。RunLoop的使用场合:
1、使用端口或自定义输入源和其他线程通信;
2、子线程中使用了定时器;
3、Cocoa中使用任何performSelector到了线程中运行方法;
4、使线程执行周期性任务。仅当在为你的程序创建辅助线程的时候,你才需要显式运行一个 RunLoop。