多线程-----充分发挥多核处理器的优势
selector:选择器 perform:执行 detach:派遣
Invocation:调用 dependency:依赖 application:应用
进程-应用程序,负责开辟一块内存区域,共应用程序执行,每一个进程都默认有一个主线程
线程-要执行的任务流
什么是多线程:1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。
线程中的串行:1个线程中任务的执行是串行的。
-----NSThred-------
-NSThred 每个对象是个线程 真正的多线层 /线程
-----NSOperation-------
英语:Operation:操作Queue:队列
-NSOperation/NSOperationQueue 面向对象的线程技术
ios2.0后就有了
NSOperation有两个子类 NSInvocationOperation/NSBlockOpration
//操作步骤
新建一个队列-》队列添加线程(addOperationWithBlock)
//将线程添加到主队列
[NSOperationQueue mainQueue]addOperationWithBlock
//制定最大线程数
队列.maxConcurrentOperationCount=2
-----GCD-------
//英语:Grand:最重要的 Central:核心的 Dispatch:派遣
global:全局 async:异步 sync:同步
//-GCD-Grand Central Dispatch ios4.0后出的GCD C语言框架
使用步骤 (写代码都是Dispatch开头的)
1/全局队列 (可能开启多条线程)
建队列--》建立异步/同步执行Block里面写(可并行执行几个顺序无先后,可在主队列中执行)
//创建队列
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//将异步线程添加到队列
dispatch_async(queue, ^{
[self GCDWithMessage:@"huohuo"];
});
//将线程添加到群组,后统一得到通知
创建群组-》将线程添加到群组-》获得通知
dispatch_group_t group=dispatch_group_creat()
dispatch_group_notify(group,queue,^){}
//利用GCD实现图片的内存缓存技术,
//内存缓存,就是再次运行时,需从网络上从新下载图像(例如:装进了数组)
//磁盘缓存:将数据写进沙盒,缺点如果网络上的图片变化了,可能无法及时更新,所以使用磁盘缓存是需要更多的网络缓存技术。
//第三方框架 SDY Image 解决缓存问题的第三方框架
//主线程不能写同步(sync)
2/串行队列 (只可能开启一条线程)
为决绝线程执行顺序的问题
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
串行队列是creat的 建队列——》添加队列
3/更新UI界面的操作在主队列里面做
dispatch_async(dispatch_get_main_queue(), ^{
[self addMessage:str];//更新UI
});
4/主队列
dispatch_get_main_queue();
instance:实例
-------单例模式-------
1:定义:保证内存中只有类的单个实例,在一个类中,怎么创建只有一个实例化对象
1.0:单例操作步骤
创建静态变量-》在allocWithZone方法里面用GCD 包装实例化对象-》编写share方法以便管理
1.1:在类方法里面,想使用成员变量,static 定义
+ allcWithZone:(struct _NSZone *)zone
{
1.2://这种方法只支持在单线程里面使用
// if (_instance=nil)
// _instance=[super allcWithZone];
1.3://这种方法只支持在多线程里面使用 dispatch_once_t GCD为决绝多线程单例问题提供的
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^){
_instance=[super allcWithZone];
});
return _instance;
}
-------互斥锁的使用原则------
synchronize:使同时发生
1:被抢夺的属性要为原子属性(atomic)
2:读取原子属性的代码处,使用互斥锁
//保证一个人进一次
ps:用互斥锁严重影响系统性能,日常少用
@synchronized(self){}互斥锁