ios多线程

ios atomic nonatomic区别

血红的双手。 提交于 2020-04-07 03:35:38
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。 atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全。 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样: {lock} if (property != newValue) { [property release]; property = [newValue retain]; } {unlock} 禁止多线程,变量保护,提高性能。 atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。 指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。 来源: oschina 链接: https:/

iOS多线程的初步研究(九)-- dispatch源

时光怂恿深爱的人放手 提交于 2020-04-03 05:32:47
dispatch源( dispatch source )和RunLoop源概念上有些类似的地方,而且使用起来更简单。要很好地理解dispatch源,其实把它看成一种特别的生产消费模式。dispatch源好比生产的数据,当有新数据时,会自动在dispatch指定的队列(即消费队列)上运行相应地block,生产和消费同步是dispatch源会自动管理的。 dispatch源的使用基本为以下步骤: 1. dispatch_source_t source = dispatch_source_create ( dispatch_source_type , handler , mask , dispatch_queue ); //创建dispatch源,这里使用加法来合并dispatch源数据,最后一个参数是指定dispatch队列 2. dispatch_source_set_event_handler (source, ^{ //设置响应dispatch源事件的block,在dispatch源指定的队列上运行   //可以通过 dispatch_source_get_data (source)来得到dispatch源数据 }); 3. dispatch_resume (source); //dispatch源创建后处于suspend状态,所以需要启动dispatch源 4.

iOS多线程系统整理 swift

倖福魔咒の 提交于 2020-04-03 05:26:25
多线程 是一个应用程序内多个代码的执行路径,执行线程,同时在同一时间里执行不同的任务。 三种: 1、NSTread 2、Cocoa NSOperation (NSOperation,NSOperationQueue) 3、GrandCentralDispatch:GCD 1\NSTread 相对最简单,需要自己管理线程的生命周期和线程同步(加锁会有一定的系统开销) 两种应用方式: 需要传递三个参数: selector:线程执行方法"" target:方法所在的对象 argument:传递给方法的参数,可选nil 一、直接创建线程,自动运行线程 // Class Method class func detachNewThreadSelector(selector:Selector,toTarget target:AnyObject,withObject argument:AnyObject?) 二、先创建一个线程对象,手动运行线程,在运行之前可设置线程优先级等信息。 convenience init(target:AnyObject,selector:Selector,object argument:AnyObject?) for example // download image method func downloadImage() { var imageUrl = "https

iOS多线程——GCD篇

左心房为你撑大大i 提交于 2020-04-03 05:25:54
什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效。 在GCD出现之前Cocoa框架提供了NSObject类的 performSelectorInBackground:withObject performSelectorOnMainThread 方法来简化多线程编程技术。 GCD可以解决以下多线程编程中经常出现的问题: 1.数据竞争(比如同时更新一个内存地址) 2.死锁(互相等待) 3.太多线程导致消耗大量内存 在iOS中,如果把需要消耗大量时间的操作放在主线程上面,会妨碍主线程中被称为RunLoop的主循环的执行,从而导致不能更新用户界面、应用程序的画面长时间停滞等问题。 Dispatch Queue Dispatch Queue是GCD中对于任务的抽象队列(FIFO)执行处理。 queue分为两种, SERIAL_DISPATCH_QUEUE           等待现在执行中处理结束 CONCURRENT_DISPATCH_QUEUE       不等待现在执行中处理结束 换句话说也就是 SERIAL_DISPATCH_QUEUE 是串行,CONCURRENT_DISPATCH_QUEUE是并行。 具体到线程上,就是SERIAL_DISPATCH

iOS多线程GCD

懵懂的女人 提交于 2020-04-03 05:22:56
GCD是和block紧密相连的,所以最好先了解下block。GCD是C level的函数,这意味着它也提供了C的函数指针作为参数。 下面首先来看GCD的使用: dispatch_async(dispatch_queue_t queue, dispatch_block_t block); async表明异步运行,除了async,还有sync(同步),delay(延时) block代表的是你要做的事情, queue则是你把任务交给谁来处理了. dispatch_async 这个函数是异步的,这就意味着它会立即返回而不管block是否运行结束。因此,我们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。 之所以程序中会用到多线程是因为程序往往会需要读取数据,然后更新UI。为了良好的用户体验,读取数据的操作会倾向于在后台运行,这样以避免阻塞主线程。 GCD里就有三种queue来处理. 1. Main queue:   顾名思义,运行在主线程,由dispatch_get_main_queue获得。和UI相关的就要使用Main Queue. main dispatch queue 是一个全局可用的串行队列,其在行用程序的主线程上执行任务。此队列的任务和应用程序的主循环(run loop)要执行的事件源交替执行。因为其运行在应用程序的主线程,main

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

寵の児 提交于 2020-03-28 04:03:41
进程 :正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间; 线程 :线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程。 队列 : dispatch_queue_t,一种先进先出的数据结构, 线程的创建和回收不需要程序员操作,由队列负责。    串行队列 :队列中的任务只会顺序执行(类似跑步)        dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial);    并行队列 :队列中的任务通常会并发执行(类似赛跑)       dispatch_queue_t q = dispatch_queue_create("......", dispatch_queue_concurrent);    全局队列 :是 系统开发 的,直接拿过来(get)用就可以;与并行队列类似,但调试时,无法确认操作所在队列       dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);    主队列 :每一个应用程序对应唯一一个主队列,直接get即可;在多线程开发中,使用主队列更新UI        dispatch_queue

iOS开发多线程篇—创建线程

三世轮回 提交于 2020-03-26 09:48:56
iOS开发多线程篇—创建线程 一、创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建、启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 + (BOOL)isMainThread; // 是否为主线程 其他用法 获得当前线程 NSThread *current = [NSThread currentThread]; 线程的调度优先级:调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高 + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; 设置线程的名字 - (void)setName:(NSString *)n; - (NSString *)name; 其他创建线程的方式 (2)创建线程后自动启动线程 [NSThread detachNewThreadSelector:

iOS多线程开发之GCD(死锁篇)

霸气de小男生 提交于 2020-03-22 06:04:02
上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题。有兴趣的朋友可以回顾《 iOS多线程开发之GCD(上篇) 》和《 iOS多线程开发之GCD(中篇) 》。 言归正传,我们首先来回顾下死锁,所谓死锁: 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源(如数据源,内存等,变量不是资源)而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去。   死锁形成的原因: 系统资源不足 进程(线程)推进的顺序不恰当; 资源分配不当   死锁形成的条件: 互斥条件: 所谓互斥就是进程在某一时间内独占资源。 请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件: 进程已获得资源,在末使用完之前,不能强行剥夺。 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。 在GCD中,主要的死锁就是当前串行队列里面同步执行当前串行队列。解决的方法就是将同步的串行队列放到另外一个线程执行。 在举例说明之前,我们先来回顾下GCD的中的任务派发和队列。 (1)任务派发 任务派发方式 说明 dispatch_sync() 同步执行,完成了它预定的任务后才返回,阻塞当前线程 dispatch_async() 异步执行,会立即返回,预定的任务会完成但不会等它完成,不阻塞当前线程 (2)队列种类 队列种类 说明 串行队列

多线程 NSThread

霸气de小男生 提交于 2020-03-20 03:03:47
多线程 NSThread 创建和启动线程 一个NSThread对象就代表一条线程 创建、启动线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 + (BOOL)isMainThread; // 是否为主线程 其他用法 获得当前线程 NSThread *current = [NSThread currentThread]; 线程的调度优先级 + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; - (double)threadPriority; - (BOOL)setThreadPriority:(double)p; 调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高 线程的名字 - (void)setName:(NSString *)n; - (NSString *)name; 其他创建线程方式

iOS多线程的初步研究(三)-- NSRunLoop

假装没事ソ 提交于 2020-03-20 03:02:46
弄清楚 NSRunLoop确实 需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源,呜呜)。 官网的解释是说run loop可以用于处理异步事件,很抽象的说法。不罗嗦,先看看NSRunLoop几个常用的方法。 + ( NSRunLoop *)currentRunLoop; //获得当前线程的run loop + (NSRunLoop *)mainRunLoop; //获得主线程的run loop - ( void )run; //进入处理事件循环,如果没有事件则立刻返回。注意:主线程上调用这个方法会导致无法返回(进入无限循环,虽然不会阻塞主线程),因为主线程一般总是会有事件处理。 - ( void )runUntilDate:( NSDate *)limitDate; //同run方法,增加超时参数limitDate,避免进入无限循环。使用在UI线程(亦即主线程)上,可以达到暂停的效果。 - ( BOOL )runMode:( NSString *)mode beforeDate:( NSDate *)limitDate; //等待消息处理,好比在PC终端窗口上等待键盘输入。一旦有合适事件(mode相当于定义了事件的类型)被处理了,则立刻返回;类同run方法,如果没有事件处理也立刻返回;有否事件处理由返回布尔值判断