线程的注意点

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. TP的一条sql语句(子查询)

    $model=M(''); $model->table(C('DB_PREFIX').'goods as g') ->join(C('DB_PREFIX').'orders as o on ...

  2. cocos2d-x学习之自动内存管理

    一.自动内存管理 1)概述 C++语言默认是没有提供自动内存管理的.使用者需要自己分配,自己释放.在cocos2d-x里提供了一个自动内存管理的方案.主要是通过CCObject来提供的,用户只要继承了 ...

  3. 关于linux内核模块Makefile的解析

    转载:http://www.embeddedlinux.org.cn/html/yingjianqudong/201403/23-2820.html Linux内核是一种单体内核,但是通过动态加载模块 ...

  4. 倒数计数器-CountDownLatch

    最近写一个多线程程序,老是MAIN方法执行完了子线程还没执行完(不知道以前怎么玩儿的),得不到最终结果,于是找到了CountDownLatch CountDownLatch是一个同步辅助类,java. ...

  5. java操作spark1.2.0

    虽然推荐的是scala,但是还是试一下 package org.admln.java7OperateSpark; import java.util.Arrays; import java.util.L ...

  6. 浅析jQuery中常用的元素查找方法总结

    本篇文章是对jQuery中常用的元素查找方法进行了详细的总结和介绍,需要的朋友参考下   $("#myELement") 选择id值等于myElement的元素,id值不能重复在文 ...

  7. EF——继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子 05 (转)

    EF里的继承映射关系TPH.TPT和TPC的讲解以及一些具体的例子   本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF ...

  8. F - Tree

    Description You are to determine the value of the leaf node in a given binary tree that is the termi ...

  9. #maven解决乱码问题

    <build>        <plugins>        <plugin>        <groupId>org.apache.maven.pl ...

  10. xml<>编译

    < 用 <    >用 >      表示"空格"