线程的注意点

1.不要同时开太多的线程(1~3条线程即可,不要超过5条)

2.线程概念

* 主线程 : UI线程,显示、刷新UI界面,处理UI控件的事件

* 子线程 : 后台线程,异步线程

3.不要把耗时的操作放在主线程,要放在子线程中执行

一、NSThread

1.创建和启动线程的3种方式

1> 先创建,后启动

 // 创建

 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:nil];

 // 启动

 [thread start];

2> 创建完自动启动

[NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil];

3> 隐式创建(自动启动)

[self performSelectorInBackground:@selector(download:) withObject:nil];

2.常见方法

1> 获得当前线程

+ (NSThread *)currentThread;

2> 获得主线程

+ (NSThread *)mainThread;

3> 睡眠(暂停)线程

+ (void)sleepUntilDate:(NSDate *)date;

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

4> 设置线程的名字

- (void)setName:(NSString *)n;

- (NSString *)name;

二、线程同步

1.实质:为了防止多个线程抢夺同一个资源造成的数据安全问题

2.实现:给代码加一个互斥锁(同步锁)

@synchronized(self) { //影响性能,不建议使用

    // 被锁住的代码

}

三、GCD

1.队列和任务

1> 任务 :需要执行什么操作

* 用block来封装任务

2> 队列 :存放任务

* 全局的并发队列 : 可以让任务并发执行

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

* 自己创建的串行队列 : 让任务一个接着一个执行

dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue", NULL);

* 主队列 : 让任务在主线程执行

dispatch_queue_t queue = dispatch_get_main_queue(); 

2.执行任务的函数

1> 同步执行 : 不具备开启新线程的能力

dispatch_sync...

2> 异步执行 : 具备开启新线程的能力

dispatch_async...

3.常见的组合

1> dispatch_async + 全局并发队列

2> dispatch_async + 自己创建的串行队列

4.线程间的通信

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{

   // 执行耗时的异步操作...

   dispatch_async(dispatch_get_main_queue(), ^{

       // 回到主线程,执行UI刷新操作

   });

});

5.GCD的所有API都在libdispatch.dylib,Xcode会自动导入这个库

* 主头文件 : #import <dispatch/dispatch.h>

6.延迟执行

1> perform....

// 3秒后自动回到当前线程调用self的download:方法,并且传递参数:@"http://555.jpg"

[self performSelector:@selector(download:) withObject:@"http://555.jpg" afterDelay:];

2> dispatch_after...

// 任务放到哪个队列中执行

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

double delay = ; // 延迟多少秒

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), queue, ^{

    // 3秒后需要执行的任务

}); 

7.一次性代码

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

    // 这里面的代码,在程序运行过程中,永远只会执行1次

});

四、NSOperation和NSOperationQueue

1.队列的类型

1> 主队列

* [NSOperationQueue mainQueue]

* 添加到"主队列"中的操作,都会放到主线程中执行

2> 非主队列

* [[NSOperationQueue alloc] init]

* 添加到"非主队列"中的操作,都会放到子线程中执行

2.队列添加任务

 - (void)addOperation:(NSOperation *)op;

 - (void)addOperationWithBlock:(void (^)(void))block;

3.常见用法

1> 设置最大并发数

- (NSInteger)maxConcurrentOperationCount;

- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

2> 队列的其他操作

* 取消所有的操作

- (void)cancelAllOperations;

* 暂停所有的操作

[queue setSuspended:YES];

* 恢复所有的操作

[queue setSuspended:NO];

4.操作之间的依赖(面试题)

* NSOperation之间可以设置依赖来保证执行顺序

// 操作B依赖于操作A,等操作A执行完毕后,才会执行操作B

[operationB addDependency:operationA];

* 注意:不能相互依赖,比如A依赖B,B依赖A

* 可以在不同queue的NSOperation之间创建依赖关系

5.线程之间的通信

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[queue addOperationWithBlock:^{

    // 1.执行一些比较耗时的操作

    // 2.回到主线程

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

    }];

}];

五、从其他线程回到主线程的方式(三种办法)

//1.perform...

[self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];

//2.GCD

dispatch_async(dispatch_get_main_queue(), ^{

});

//3.NSOperationQueue

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

}];

六、判断编译器的环境:ARC还是MRC?

#if __has_feature(objc_arc)

// 当前的编译器环境是ARC

#else

// 当前的编译器环境是MRC

#endif

七、类的初始化方法

1.+(void)load

* 当某个类第一次装载到OC运行时系统(内存)时,就会调用

* 程序一启动就会调用

* 程序运行过程中,只会调用1次

2.+(void)initialize

* 当某个类第一次被使用时(比如调用了类的某个方法),就会调用

* 并非程序一启动就会调用

3.在程序运行过程中:1个类中的某个操作,只想执行1次,那么这个操作放到+(void)load方法中最合适

复习IOS多线程知识的更多相关文章

  1. iOS多线程知识总结--GCD

    iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...

  2. iOS多线程知识梳理

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

  3. iOS 多线程知识梳理

    #iOS多线程知识梳理 ##线程进程基础概念 ###进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 ###线程 1个进程要想执行任务,必须 ...

  4. IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...

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

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...

  6. Java复习8.多线程

    Java复习8 多线程知识 20131007 前言: 在Java中本身就是支持多线程程序的,而不是像C++那样,对于多线程的程序,需要调用操作系统的API 接口去实现多线程的程序,而Java是支持多线 ...

  7. iOS中多线程知识总结(一)

    这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序.   ...

  8. iOS多线程编程的知识梳理

    多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐.在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如AFNetworkin ...

  9. iOS多线程学习

    在 iOS 中其实目前有 4 套多线程方案,他们分别是: Pthreads NSThread GCD NSOperation & NSOperationQueue 所以接下来,我会一一讲解这些 ...

随机推荐

  1. cdoj 03 BiliBili, ACFun… And More! 水题

    Article Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/3 Descr ...

  2. 查询记录时rs.previous()的使用

    查询记录时rs.previous()的使用 假如查询一个数据表,假设没有记录就显示提示信息,有就所有显示出来查询结果.这时假设是有查询结果的话就须要进行两次查询,第一次查完记录指针指向最后一条记录,開 ...

  3. android Activity的杂乱总结

    android中Activity可以说是四大组件中用的最为广泛,也是最为基本的一个组件.几乎和用户的所有交互都需要通过Activity来实现. 最近在学习过程中,有一些关于Activity的内容,让我 ...

  4. qt creator中使用qwt插件

    前提:我用mingw编译的qwt. 将qwt插件集成到qt designer非常easy.仅仅要把qwt编译的qwt_designer_plugin.dll复制到C:\Qt\Qt5.3.1\5.3\m ...

  5. 一行命令搞定VS2012无法安装cocos2d-x-2.1.4及创建跨平台项目(二)

    转自:http://blog.csdn.net/yangjingui/article/details/9418843 由于上次发了一个比较二的方法来解决VS2012无法安装cocos2d-x-2.1. ...

  6. Reservoir Sampling - 蓄水池抽样

    问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the o ...

  7. 之前的Android项目报错,新建Android项目报错,代码中找不到错误解决方案

    打开一年前的东西,结果发现里面的android项目全部有个红叉,也找不到错误.新建一个项目也报错,首先确定自己的环境应该没问题,然后通过查看网上的资料,发现可能是debug的keystore到期啦. ...

  8. SVM多分类

    http://www.matlabsky.com/thread-9471-1-1.htmlSVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器.目前,构造SVM多类分类器 ...

  9. spring security源码分析之web包分析

    Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案.一般来说,Web 应用的安全性包括 ...

  10. C. Anya and Smartphone

    C. Anya and Smartphone time limit per test 1 second memory limit per test 256 megabytes input standa ...