1、概述

(1) Run Loop提供了一种异步执行代码的机制,不能并行执行任务。

(2) 在主队列中,Main Run Loop直接配合任务的执行,负责处理UI事件、计时器,以及其它内核相关事件。

(3) Run Loop的主要目的是保证程序执行的线程不会被系统终止。

Run Loop的工作特点:

(1) 当有事件发生时,Run Loop会根据具体的事件类型通知应用程序做出响应。

(2) 当没有事件发生时,Run Loop会进入休眠状态,从而达到省电的目的。

(3) 当事件再次发生时,Run Loop会被重新唤醒,处理事件。

主线程和其他线程中的Run Loop

iOS程序的主线程默认已经配置好了Run Loop,其他线程默认情况下没有设置Run Loop。

一般在开发中很少会主动创建RunLoop,而通常会把事件添加到RunLoop中。

loop示意图:

2UIApplication中的Run Loop

3多线程中的循环引用

如果self对象持有操作对象的引用,同时操作对象当中又直接访问了self时,才会造成循环引用。

单纯在操作对象中使用self不会造成循环引用。

注意:此时不能使用(weakSelf)

4、多线程中的资源共享

并发编程中许多问题的根源就是在多线程中访问共享资源。资源可以是一个属性、一个对象、网络设备或者一个文件等。

在多线程中任何一个共享的资源都可能是一个潜在的冲突点,必须精心设计以防止这种冲突的发生。

资源共享示例:

5互斥锁(@synchronized)

互斥锁使用注意:

(1)加互斥锁,在共享资源的“读”“写”范围添加互斥锁

(2)要让锁的范围尽可能小!

(3)资源抢夺做简单的做法就是使用互斥锁@synchronized

(4)使用互斥锁,会变慢,互斥锁的代价十分高昂!

加上互斥锁就可以使一个资源在同一时间只能被一个线程访问,只有这个资源被这个线程用完后其他线程才能访问。

互斥锁用法:

@synchronized(self) {

//线程操作

}

例如:

@interface MJViewController ()

@property (weak, nonatomic) IBOutlet UITextView *infoText;

// 票数,若使用原子锁,只需在互斥锁的基础上把下面nonatomic改为atomic即可

@property (nonatomic, assign) NSInteger tickets;

@end

@implementation MJViewController

- (void)viewDidLoad

{

[super viewDidLoad];

}

// 卖票循环,一直卖完为止

- (void)doSaleLoop:(NSString *)opName

{

// 所有线程进入都可以循环卖票

while (YES) {

@synchronized(self) {

if (self.tickets > 0) {

--self.tickets;

NSLog(@"剩余票数 %d - %@ - %@", self.tickets, opName, [NSThread currentThread]);

} else {

break;

}

}

//-----------------------------------------

// 模拟休眠,跟资源抢夺无关,不用放在锁里

if ([opName isEqualToString:@"OP 1"]) {

[NSThread sleepForTimeInterval:1.0f];

} else {

[NSThread sleepForTimeInterval:0.3f];

}

}

}

#pragma mark 模拟多人卖票

#pragma mark GCD实现

- (IBAction)doSale:(id)sender

{

// 做多线程开始时,永远不要相信一次运行的结果

self.tickets = 20;

// 1. 队列

dispatch_queue_t q = dispatch_queue_create("sale", DISPATCH_QUEUE_CONCURRENT);

// 2. 添加任务

dispatch_async(q, ^{

[self doSaleLoop:@"OP 1"];

});

dispatch_async(q, ^{

[self doSaleLoop:@"OP 2"];

});

dispatch_async(q, ^{

[self doSaleLoop:@"OP 3"];

});

dispatch_async(q, ^{

[self doSaleLoop:@"OP 4"];

});

}

@end

【备注】在iOS中还有一种锁的功能,原子锁 —— 多读单写的锁(128位自旋锁),也会消耗性能。

原子锁只保护写入时的数据正确,而读取不负责。

对于要写入的资源,保护“写入数据”的正确性重要,还是读取的准确性重要!

如果只是开发单写多读的功能,只需要使用原子锁即可。

@synchronized 性能消耗非常的大,苹果官方不建议使用。

在实际开发中,不要去抢夺资源!

*** 并发编程最主要的目的是提高性能,让更多的代码同时运行,达到并发运行,提高整体性能的目的!

*** 手机开发最主要的是流畅,并行,至于资源抢夺的功能开发是属于服务端的范畴!

iOS开发之Run Loop的更多相关文章

  1. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  2. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  3. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  4. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  5. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  6. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  7. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

  8. iOS开发之info.pist文件和.pch文件

    iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...

  9. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

随机推荐

  1. DB2_自动生成值

    生成数字序列的两种方法 在 DB2 中可以用两种方法自动生成一个数字序列: 定义带有 IDENTITY 属性的列. 创建 SEQUENCE 对象. IDENTITY 列 当用 IDENTITY 属性定 ...

  2. Modelbuilder快速入门

    Modelbuilder快速入门 by 李远祥 什么是modelbuilder 模型构建器是一个用来创建.编辑和管理模型的应用程序.模型是将一系列地理处理工具串联在一起的工作流,它将其中一个工具的输出 ...

  3. substring和substr、$.extend()、$.fn.extend()、(function($){….})(jQuery)的简易讲解

    1.    JS中substring与substr的区别 Substring: 该方法可以有一个参数也可以有两个参数. l  一个参数: 示例: var str="Olive": ...

  4. css3 3D效果

    css3 3D变形 transfrom初学 这个礼拜学了css3 3d,感觉到css无穷的魅力,可以通过几个特定的代码符号创建出3D效果的页面. ___ 透视 一个元素需要一个透视点才能激活3D空间, ...

  5. vue自定义日期组件

    vue-datepicker 基于 vuejs 2.x 可自定义主题的日期组件 github Usage 只需要在项目中加入 calendar.vue,就可以使用了. 向组件传入 prop 即可改变 ...

  6. SpringMvc拦截器小测试

    前言 俗话说做项目是让人成长最快的方案,最近小编写项目的时候遇到了一个小问题.小编在项目中所负责的后台系统,但是后台系统是通过系统的页面是通过ifame联动的,那么这时候问题就来了,后台所做的所有操作 ...

  7. 编写一个飞行棋项目(C#)遇到几个问题:

    在写程序中遇到如下问题:如果有人知道,请您一定要指点迷津.小白. 1.在运行暂停功能时,这个暂停功能可以实现,但是无法显示提示信息. case 3: Console.Clear(); Program. ...

  8. Ghostscript.Net Pdf 转 Image

    需求: 项目中需要实现PPT转Image的功能,之前项目中用的是使用Office COM组件实现的功能,通过.NET与Office COM组件的互操作(Interop)来操作Office文档 但是在生 ...

  9. eclipse中注释常用关键字

    关键词列表: @author 作者名 @date 日期 @version 版本标识 @parameter 参数及其意义 @since 最早使用该方法/类/接口的JDK版本 @return 返回值 @t ...

  10. fastcgi的介绍,原理及配置

    fastcgi介绍: CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上. C ...