IOS进程与线程学习笔记

来源:互联网 发布:默默西风淘宝店 编辑:程序博客网 时间:2024/06/05 03:07

    首先,什么是进程?进程:一个正在运行的程序就是一个进程,进程拥有独立的运行所需的全部资源,而一个进程至少有一个线程.那么我又要提出什么是线程.线程就是一个独立运行的代码, 例如QQ中接受消息的代码,就可以成为一个线程.线程与线程之间相互无影响,每个线程只负责完成自己部分的功能.值得注意的是,一个进程可以由多个线程组成,进程只负责调动和分配,线程才是程序的真正执行单元.

    每个正在运行的程序都至少包含一个线程,这个线程被称作主线程.主线程在程序启动是被创建, 用于执行main函数.如果只有一个主线程的程序,称作单线程程序.

    多线程就是有多个线程的程序(这是句废话),而多线程是程序员自己编写的,根据需要开辟子线程,但不能无节制的开辟线程,会造成手机的卡顿.主线程与子线程都是独立的运行单元,各自运行没有影响,因此可以并发执行.

    说完单线程与多线程的相关概念,接下来简述区别.如果一个程序中只有一个线程, 代码顺序执行,容易出现代码阻塞也就是页面假死.多线程程序线程间相互独立,不会造成阻塞现象,很好地提高了程序的运行性能.

    下面说一下IOS多线程的实现:

    在IOS中,可完成的函数有四个NSThread, NSOperation, NSObject, GCD

    NSThread:

    NSThread是一个轻量级多线程,有两种创建方法:

    - (id)initWithTarget:(id)taget select:(SEL)selector object:(id)argument

    + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

   用start函数开始执行子线程, 例如:

    NSThread *thread = [ [NSThread alloc]  initWithTarget:self select:@selector(show) object:nil];

    [thread start];

    值得注意的是, 在多线程方法中需要自己添加自动释放池来释放内存, 手动添加的子线程同样需要手动添加自动释放池.

    NSOperation

    NSOperation类, 在MVC中属于M, 是用来封装单个任务相关的代码和数据的抽象类, 所以不能直接使用.通常与NSOperationQueue结合使用.

    那么提到NSOperationQueue,那么就说说它.

    NSOperationQueue是操作队列, 他用来管理一组Operation对象的执行, 会根据需要自动为Operation开辟合适数量的线程,以完成任务的并行执行.下面介绍一下代码的写法

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

    FirstOperation *myOperation = [ [FirstOperation alloc] init];//自定义operation

    [queue addOperation:myOperation];

    NSObject

    NSObject也有一个简单地后台执行方法

    - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

    GCD

    GCD(Grand Central Dispatch)是苹果公司开发的技术.其核心就是具有一定功能的代码段.一般是一个block或者函数.GCD以队列的方式进行工作,先进先出原则,根据分发队列的类型, 创建合适数量的线程执行列队中得任务.

     disqueue queue分为两种:SerialQueue 和 Concurrent

    SerialQueue:一次只执行一个任务.Serial queue通常用于同步访问特定狗的资源或数据.当你创建多个Serialqueue时, 虽然它们各自是同步执行的,但Serialqueue与Serialqueue之间是并发执行的.



0 0