iOS多线程开发之NSObject的多线程方法
2016-03-02 10:55
387 查看
NSObject的多线程方法
NSObject提供了一些多线程的方法,这些方法使用简单而且量级轻,但无法对线程进行必要的控制,所以并不推荐使用。
开启后台执行任务的方法
多线程中的资源竞争
并发编程中许多问题的根源就是在多线程中访问共享资源,资源可以是一个属性、一个对象、网络设备或者一个文件等
在多线程中共享的资源被称作临界资源,访问了临界资源的那一部分代码被称作临界区
有临界区出现,就可能是一个潜在的冲突点,需要程序员精心去设计防止潜在的冲突发生。
在多线程开发中,如果访问了临界资源(共享资源),由于线程运行切换的时机问题可能会导致得到的结果是错误的。
在争夺临界资源时,可以使用互斥锁将临界区锁住,方法是使用@synchronized。
![](http://s2.51cto.com/wyfs02/M00/7C/B1/wKiom1bWVb-yysp4AACKd-oePxs105.png)
还有一种保护属性setter方法的原子操作是,在@property中制定atomic关键字,即在使用setter方法时,将其锁住。
在iOS开发中,不建议使用@synchronized和atomic(代价非常大),也就是说尽量不要去抢夺资源
正是出于性能的考虑,UIKit框架的绝大部分类都不是线程安全的,所以苹果才要求更新UI的操作一定要放到主线程去做
RunLoop机制
提供了一种异步执行代码的机制,不能并发执行任务
在主队列中,MainRunLoop直接配合任务的执行,负责处理UI事件、计数器、以及其他内核相关事件。
RunLoop的主要目的是保证线程不会被系统终止
工作特点:
当有事件发生时,Run Loop会根据具体的事件类型通知应用程序做出响应
当没有事件发生时,Run Loop会进入休眠状态,从而达到省电的目的
当事件再次发生时,Run Loop会被重新唤醒,处理事件
iOS程序主线程设置了RunLoop,其他线程没有设置
![](http://s2.51cto.com/wyfs02/M00/7C/AF/wKioL1bWVmvBYaPZAAHL0gUsUDA884.png)
![](http://s1.51cto.com/wyfs02/M01/7C/AF/wKioL1bWVnDiB4x2AAIk9PZXGLg372.png)
NSObject提供了一些多线程的方法,这些方法使用简单而且量级轻,但无法对线程进行必要的控制,所以并不推荐使用。
开启后台执行任务的方法
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg在后台线程中通知主线程执行任务的方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
多线程中的资源竞争
并发编程中许多问题的根源就是在多线程中访问共享资源,资源可以是一个属性、一个对象、网络设备或者一个文件等
在多线程中共享的资源被称作临界资源,访问了临界资源的那一部分代码被称作临界区
有临界区出现,就可能是一个潜在的冲突点,需要程序员精心去设计防止潜在的冲突发生。
在多线程开发中,如果访问了临界资源(共享资源),由于线程运行切换的时机问题可能会导致得到的结果是错误的。
在争夺临界资源时,可以使用互斥锁将临界区锁住,方法是使用@synchronized。
![](http://s2.51cto.com/wyfs02/M00/7C/B1/wKiom1bWVb-yysp4AACKd-oePxs105.png)
还有一种保护属性setter方法的原子操作是,在@property中制定atomic关键字,即在使用setter方法时,将其锁住。
在iOS开发中,不建议使用@synchronized和atomic(代价非常大),也就是说尽量不要去抢夺资源
正是出于性能的考虑,UIKit框架的绝大部分类都不是线程安全的,所以苹果才要求更新UI的操作一定要放到主线程去做
RunLoop机制
提供了一种异步执行代码的机制,不能并发执行任务
在主队列中,MainRunLoop直接配合任务的执行,负责处理UI事件、计数器、以及其他内核相关事件。
RunLoop的主要目的是保证线程不会被系统终止
工作特点:
当有事件发生时,Run Loop会根据具体的事件类型通知应用程序做出响应
当没有事件发生时,Run Loop会进入休眠状态,从而达到省电的目的
当事件再次发生时,Run Loop会被重新唤醒,处理事件
iOS程序主线程设置了RunLoop,其他线程没有设置
![](http://s2.51cto.com/wyfs02/M00/7C/AF/wKioL1bWVmvBYaPZAAHL0gUsUDA884.png)
![](http://s1.51cto.com/wyfs02/M01/7C/AF/wKioL1bWVnDiB4x2AAIk9PZXGLg372.png)
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 个人信息安全报告发布:有 APP 每分钟调用位置权限 1468 次
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- 下载量超过一亿的流行应用被发现含有恶意模块
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 苹果与Siri的七年之痒:“宫斗”戏码不断上演
- APP添加CNZZ统计插件教程 Android版添加phonegap
- Android APP与媒体存储服务的交互
- java实现收藏名言语句台词的app
- 修改Android App样式风格的方法
- Android App数据格式Json解析方法和常见问题
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略