进程和线程

要使用多线程,首先需要理解进程和线程这2个概念。这里我简单的说一下。

所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令)。一个进程至少包含一条线程,线程是程序的执行流。

•iOS程序启动时,在创建一个进程的同时, 会开始运行一个线程,该线程被称为主线程
•系统中的每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则共用进程的内存空间
•每创建一个新的线程,都会消耗一定内存和CPU时间
•当多个线程对同一个资源出现争夺的时候需要注意线程安全问题
 
多线程的应用及使用注意事项
将耗时、轮询或者并发需求高等任务分配到其他线程执行,并由主线程负责统一更新界面会使得应用程序更加流畅,用户体验更好,例如网络请求,播放游戏的背景音乐等。
•线程使用不是无节制的
–iOS中的主线程的堆栈大小是1M
–从第二个线程开始都是512KB
–这些数值不能通过编译器开关或线程API函数更改
注:更新UI界面,处理界面和用户之间的交互事件一定要在主线程中处理。
 
iOS中的多线程技术
 
1.NSObject的多线程方法-对NSThread的封装(一个NSThread对象对应一条线程)
 
•开启后台线程执行任务的方法
-(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
•在后台线程中通知主线程执行任务的方法
–(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
•获取线程信息
[NSThread currentThread];
•线程休眠      
[NSThread sleepForTimeInterval:1.0f];

提示:

–performSelectorInBackground方法本身是在主线程中执行的,而选择器指定的方法是在后台线程中进行的
–尽管使用performSelectorInBackground方法调用的任务可以更新UI界面,但是在实际开发中,涉及到UI界面的更新操作,还是要使用performSelectorOnMainThread方法,以避免不必要的麻烦
注:
•内存管理对于多线程非常重要
•Objective-C可以凭借@autoreleasepool使用内存资源,并需要时回收资源
•每个线程都需要有@autoreleasepool,否则可能会出现内存泄漏
 
2.NSThread
 
•创建线程方法:
1.+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
2.- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
•参数说明:
–selector:线程执行的方法,只能有一个参数,不能有返回值
–target:selector消息发送的对象
–argument:传输给target的唯一参数,也可以是nil
 
3.NSOperation/NSOperationQueue
 
•NSOperation的两个子类
1.NSInvocationOperation
2.NSBlockOperation
 
•工作原理:
1.用NSOperation封装要执行的操作
2.将创建好的NSOperation对象放NSOperationQueue中
3.启动OperationQueue开始新的线程执行队列中的操作
•注意事项:
1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢
2.使用以下方法可以控制并发的线程数量:
-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;
3.使用addDependency可以建立操作之间的依赖关系,设定操作的执行顺序
 
上面的程序设置依赖关系后,只有等操作a和b都执行完,才会执行c.
 
4.GCD
 
•GCD队列:
1.全局队列:所有添加到主队列中的任务都是并发执行的(可能会开启多条线程)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.串行队列:所有添加到串行队列中的任务都是顺序执行的(只可能会开启一条线程)
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
3.主队列:所有添加到主队列中的任务都是在主线程中执行的
dispatch_get_main_queue();

•异步操作
–dispatch_async 在其他线程执行任务,会开启新的线程
–异步方法无法确定任务的执行顺序
•同步操作
–dispatch_sync 在当前在线程执行任务,不开启新的线程
–同步操作与队列无关
–同步方法会依次执行,能够决定任务的执行顺序
–更新界面UI时,最好使用同步方法
注:同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)。
 
试例1:

分析:虽然任务都是添加到全局队列中,但是都是同步操作,所以不会开启新的线程,是在当前线程中执行任务。

试例2:

分析:将3个任务添加到串行队列中,虽然是异步的操作,会开启新的线程,但最多最会开启一个。

试例3:

分析:不管是同步还是异步的任务添加到主队列中,都是在主线程中执行

多线程技术在iOS开发中的使用的更多相关文章

  1. 多线程在iOS开发中的应用

    多线程基本概念 01 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 02 线程 2-1 基本概念 1个进程要想执行任务,必须得有线程 ...

  2. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...

  3. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  4. fir.im Weekly - iOS开发中的Git流程

    本期 fir.im Weekly 收集了微博上的热转资源,包含 Android.iOS 开发工具.源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用. 精仿知乎日报 iOS 端 @我偏 ...

  5. IOS开发中UI编写方式——code vs. xib vs.StoryBoard

    最近接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问,就是应该如何制作UI界面.iOS应用是非常重视用户体验的,可以说绝大多数的应用成功与否与交互设计以及UI是否漂亮易用有着非常大的关 ...

  6. iOS开发中的4种数据持久化方式【一、属性列表与归档解档】

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...

  7. 在iOS开发中使用FMDB

    在iOS开发中使用FMDB 前言 SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK 很早就支持了 SQLite,在使用时,只需 ...

  8. iOS开发中你是否遇到这些经验问题

    前言 小伙伴们在开发中难免会遇到问题, 你是如何解决问题的?不妨也分享给大家!如果此文章其中的任何一条问题对大家有帮助,那么它的存在是有意义的! 反正不管怎样遇到问题就要去解决问题, 在解决问题的同时 ...

  9. 简述 Ruby 与 DSL 在 iOS 开发中的运用

    阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain Specific Language) 翻译成中文就是:"领域特定语言".首先,从定义就 ...

随机推荐

  1. Spring事务注解@Transactional回滚问题

    Spring配置文件,声明事务时,如果rollback-for属性没有指定异常或者默认不写:经测试事务只回滚运行时异常(RuntimeException)和错误(Error). <!-- 配置事 ...

  2. minio-dotnet --云存储服务

    inio是一家成立于2014年的生产开源云存储产品的新兴创业公司.这家创业公司是其创始人继Gluester之后的又一杰作,Gluester公司已经在2011年被Red Hat公司以1.36亿美元的价格 ...

  3. 使用163CentOS镜像

    CentOS镜像使用帮助 收录架构 i386 x86_64 SRPMS 收录版本 5 6 更新时间 每5小时更新一次   使用说明 首先备份/etc/yum.repos.d/CentOS-Base.r ...

  4. 10、会话管理/编程实战分析/Jsp

    1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建C ...

  5. python 拷贝文件夹下所有的文件到指定文件夹(不包括目录)

    1.随便简单些写了一下.直接粘结代码,只是简单的实现一下,还很多需要完善和扩展的地方,比如忽略掉后缀文件,删除文件 如果排除的某些的话可以用: sourceF.find('.后缀')>0 2.注 ...

  6. xheditor上传图片配置

    二. 源码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Xeditor.a ...

  7. Linux下怎么运行java程序

    在Linux下安装好jdk配置好环境变量后,要回到程序所在的目录下,然后跟在windows一样输入   java (程序名)运行,原理是就好像在Windows的DOS环境下执行java这个命令时必须在 ...

  8. java中文件的读取和写入

    //首先要顶一个file文件用来存放要读取的文件 File f=new File("c:/test/aa.txt"); //在实例化一个输入流,并把文件对象传到里面 FileInp ...

  9. OracleHelper 动软生成

    using System; using System.Collections; using System.Collections.Specialized; using System.Data; usi ...

  10. 使用oracle写if判断

    DECLARE L_X INT; BEGIN SELECT COUNT(*) INTO L_X FROM SYSTEMROLEFUNCTION WHERE ROLEID = '1'; IF L_X & ...