进程:程序在计算机的一次运行活动,一个程序就是一个进程,在iOS中一个app就是一个进程
线程:程序运行的最小单元,一个进程中至少有一个线程(主线程)
一. 通过NSObject的方法管理线程
这种方法会帮助我们自己主动开辟一个后台线程,不须要自己创建
參数:(1)在这个后台线程中运行的方法
參数:(2)用于传递參数,没有为nil
[self performSelectorInBackground:@selector(banZhuanPlus) withObject:nil];
}
二. 通过 NSTread方法管理 线程
參数: (1) 方法的运行者 ,(2) 在线程中的运行的方法 ,(3) 用于传递參数,没有为nil
1.创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(banZhuanPlus) object:nil];
2.运行
[thread start];
[thread release];
三 . 通过 NSOperationQueue 方法管理线程
NSOperation 是操作单元 , 用来运行方法 , 是一个抽象类 , 必须子类化或者使用系统创建好的子类 : 如 NSInvocationOperation,NSBlockOperation
NSOperation, 是最小的操作单元 , 仅仅能运行一次
第一步 , 创建操作单元(两种方法)
1.1 NSInvocationOperation *invocation = [[ NSInvocationOperation alloc ] initWithTarget : self selector : @selector (banZhuanPlus) object : nil ]; 1.2 NSBlockOperation *block = [ NSBlockOperation blockOperationWithBlock :^{
主线程中运行
[self banZhuanPlus];
}];
2.创建队列
队列会自己主动创建一个辅助的线程 ;队列里面能加入� NSOperation 及子类的对象
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
最大并行数设置,同一时候运行几个操作单元
[queue setMaxConcurrentOperationCount:1];
3.运行,仅仅要把操作单元加入�到队列中,它就会运行
[queue addOperation:block];
[queue addOperation:invocation];
四 . 通过 GCD 方法管理线程
GCD:Grand Central Dispatch, 大中央调度 , 是 Apple 推崇的多线程管理策略 , 是通过队列对多线程进行管理
1. 创建队列 (三 种方法 )
第一种队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();//主调队列,在主线程中运行,而且是串行(一次操作一个)
另外一种队列
全局队列,在子线程中运行,而且是并行(一次能够运行多个);
參数:(1)设置队列的优先级(high, default,low,background);(2)预留參数,未来使用
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第三种队列
自己定义队列,在子线程中运行,能够设置并行或者串行
參数:(1)区分队列的唯一标识可选项,假设不写:NULL;假设写,规范样例”com.example.myqueue".
參数:(2)设置并行或者串行的
并行 :DISPATCH_QUEUE_CONCURRENT;
串行:DISPATCH_QUEUE_SERIAL(or NULL)
dispatch_queue_t customQueue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);
2. 运行 ( 三种方法 )
第一种,同步运行(须要等待运行完成)
參数:(1)指定队列,(2)Block,运行的操作
dispatch_sync(globalQueue, ^{
[self banZhuanPlus];//运行的操作
});另外一种,异步运行(无需等待)
dispatch_async(globalQueue, ^{
[self banZhuanPlus];//运行的操作
});第三种 , 延迟运行
參数 :(1) 要延迟运行的时间 ,(2)// 运行的操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self banZhuanPlus];
});
五.线程中注意点
第一,假设是在MRC模式下,线程中的autorelease对象不能释放,必须手动释放,或者加入�自己主动释放池
第二 , 子线程中刷新 UI 可能会失败 ( 在子线程中不要刷新 UI, 即改变此 UI 的设置与属性 )