零、线程的注意点(掌握)
1.不要同时开太多的线程(1~3条线程即可,不要超过5条)
2.线程概念
1> 主线程 : UI线程,显示、刷新UI界面,处理UI控件的事件
2> 子线程 : 后台线程,异步线程
3.不要把耗时的操作放在主线程,要放在子线程中执行

一、NSThread(掌握)
1.创建和启动线程的3种方式
1> 先创建,后启动

  1. // 创建
  2. NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:nil];
  3. // 启动
  4. [thread start];

2> 创建完自动启动

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

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

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

2.常见方法
1> 获得当前线程

  1. + (NSThread *)currentThread;

2> 获得主线程

  1. + (NSThread *)mainThread;

3> 睡眠(暂停)线程

  1. + (void)sleepUntilDate:(NSDate *)date;
  2. + (void)sleepForTimeInterval:(NSTimeInterval)ti;

4> 设置线程的名字

  1. - (void)setName:(NSString *)n;
  2. - (NSString *)name;

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

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

  1. @synchronized(self) {
  2. // 被锁住的代码
  3. }

三、GCD
1.队列和任务
1> 任务 :需要执行什么操作
* 用block来封装任务

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

  1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

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

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

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

  1. dispatch_queue_t queue = dispatch_get_main_queue();

2.执行任务的函数
1> 同步执行 : 不具备开启新线程的能力

  1. dispatch_sync...

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

  1. dispatch_async...

3.常见的组合(掌握)
1> dispatch_async + 全局并发队列
2> dispatch_async + 自己创建的串行队列

4.线程间的通信(掌握)

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
  2. // 执行耗时的异步操作...
  3.  
  4. dispatch_async(dispatch_get_main_queue(), ^{
  5. // 回到主线程,执行UI刷新操作
  6. });
  7. });

5.GCD的所有API都在libdispatch.dylib,Xcode会自动导入这个库
* 主头文件 :

  1. #import <dispatch/dispatch.h>

6.延迟执行(掌握)
1> perform....

  1. // 3秒后自动回到当前线程调用self的download:方法,并且传递参数:@"http://555.jpg"
  2. [self performSelector:@selector(download:) withObject:@"http://555.jpg" afterDelay:];

2> dispatch_after...

  1. // 任务放到哪个队列中执行
  2. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
  3. double delay = ; // 延迟多少秒
  4. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), queue, ^{
  5. // 3秒后需要执行的任务
  6. });

7.一次性代码(掌握)

  1. static dispatch_once_t onceToken;
  2. dispatch_once(&onceToken, ^{
  3. // 这里面的代码,在程序运行过程中,永远只会执行1次
  4. });

四、单例模式(懒汉式)
1.ARC

  1. @interface HMDataTool : NSObject
  2. + (instancetype)sharedDataTool;
  3. @end
  4.  
  5. @implementation HMDataTool
  6. // 用来保存唯一的单例对象
  7. static id _instace;
  8.  
  9. + (id)allocWithZone:(struct _NSZone *)zone
  10. {
  11. static dispatch_once_t onceToken;
  12. dispatch_once(&onceToken, ^{
  13. _instace = [super allocWithZone:zone];
  14. });
  15. return _instace;
  16. }
  17.  
  18. + (instancetype)sharedDataTool
  19. {
  20. static dispatch_once_t onceToken;
  21. dispatch_once(&onceToken, ^{
  22. _instace = [[self alloc] init];
  23. });
  24. return _instace;
  25. }
  26.  
  27. - (id)copyWithZone:(NSZone *)zone
  28. {
  29. return _instace;
  30. }
  31. @end

2.非ARC

  1. @interface HMDataTool : NSObject
  2. + (instancetype)sharedDataTool;
  3. @end
  4.  
  5. @implementation HMDataTool
  6. // 用来保存唯一的单例对象
  7. static id _instace;
  8.  
  9. + (id)allocWithZone:(struct _NSZone *)zone
  10. {
  11. static dispatch_once_t onceToken;
  12. dispatch_once(&onceToken, ^{
  13. _instace = [super allocWithZone:zone];
  14. });
  15. return _instace;
  16. }
  17.  
  18. + (instancetype)sharedDataTool
  19. {
  20. static dispatch_once_t onceToken;
  21. dispatch_once(&onceToken, ^{
  22. _instace = [[self alloc] init];
  23. });
  24. return _instace;
  25. }
  26.  
  27. - (id)copyWithZone:(NSZone *)zone
  28. {
  29. return _instace;
  30. }
  31.  
  32. - (oneway void)release {
  33.  
  34. }
  35.  
  36. - (id)retain {
  37. return self;
  38. }
  39.  
  40. - (NSUInteger)retainCount {
  41. return ;
  42. }
  43.  
  44. - (id)autorelease {
  45. return self;
  46. }
  47. @end

五、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之间可以设置依赖来保证执行顺序
* [operationB addDependency:operationA];
// 操作B依赖于操作A,等操作A执行完毕后,才会执行操作B
* 注意:不能相互依赖,比如A依赖B,B依赖A
* 可以在不同queue的NSOperation之间创建依赖关系

5.线程之间的通信

  1. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  2. [queue addOperationWithBlock:^{
  3. // 1.执行一些比较耗时的操作
  4.  
  5. // 2.回到主线程
  6. [[NSOperationQueue mainQueue] addOperationWithBlock:^{
  7.  
  8. }];
  9. }];

六、从其他线程回到主线程的方式
1.perform...

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

2.GCD

  1. dispatch_async(dispatch_get_main_queue(), ^{
  2.  
  3. });

3.NSOperationQueue

  1. [[NSOperationQueue mainQueue] addOperationWithBlock:^{
  2.  
  3. }];

七、判断编译器的环境:ARC还是MRC?
#if __has_feature(objc_arc)
// 当前的编译器环境是ARC

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

#endif

八、类的初始化方法
1.+(void)load
* 当某个类第一次装载到OC运行时系统(内存)时,就会调用
* 程序一启动就会调用
* 程序运行过程中,只会调用1次

2.+(void)initialize
* 当某个类第一次被使用时(比如调用了类的某个方法),就会调用
* 并非程序一启动就会调用

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

九、第三方框架的使用建议
1.用第三方框架的目的
1> 开发效率:快速开发,人家封装好的一行代码顶自己写的N行
2> 为了使用这个功能最牛逼的实现

2.第三方框架过多,很多坏处(忽略不计)
1> 管理、升级、更新
2> 第三方框架有BUG,等待作者解决
3> 第三方框架的作者不幸去世、停止更新(潜在的BUG无人解决)
4> 感觉:自己好水

3.比如
流媒体:播放在线视频、音频(边下载边播放)
非常了解音频、视频文件的格式
每一种视频都有自己的解码方式(C\C++)

4.总结
1> 站在巨人的肩膀上编程
2> 没有关系,使劲用那么比较稳定的第三方框架

十、cell的图片下载
1.面试题
1> 如何防止一个url对应的图片重复下载
* “cell下载图片思路 – 有沙盒缓存”

2> SDWebImage的默认缓存时长是多少?
* 1个星期

3> SDWebImage底层是怎么实现的?
* 上课PPT的“cell下载图片思路 – 有沙盒缓存”

2.SDWebImage
1> 常用方法

  1. - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
  2. - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;
  3. - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
  4. - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

2> 内存处理:当app接收到内存警告时

  1. /**
  2. * 当app接收到内存警告
  3. */
  4. - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
  5. {
  6. SDWebImageManager *mgr = [SDWebImageManager sharedManager];
  7.  
  8. // 1.取消正在下载的操作
  9. [mgr cancelAll];
  10.  
  11. // 2.清除内存缓存
  12. [mgr.imageCache clearMemory];
  13. }

3> SDWebImageOptions
* SDWebImageRetryFailed : 下载失败后,会自动重新下载
* SDWebImageLowPriority : 当正在进行UI交互时,自动暂停内部的一些下载操作
* SDWebImageRetryFailed | SDWebImageLowPriority : 拥有上面2个功能

 

【iOS基础】iOS 线程相关技术的更多相关文章

  1. iOS基础 - 多线程线程

    一.多线程的应用 l 充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快.更流畅 二.进程与线程概念 l 一个运行的程序就是一个进程或者叫做一个任务 l 一个进程至少包含一个线程,线程 ...

  2. iOS开发系列-线程同步技术

    概述 多线程的本质就是CPU轮流随机分配给每条线程时间片资源执行任务,看起来多条线程同时执行任务. 多条线程同时访问同一块资源,比如操作同一个对象.统一变量.同一个文件,就会引发数据错乱和数据安全的问 ...

  3. iOS基础 - iOS程序启动原理

    一.UIApplicationMain 在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点 int UIApplicationMain(int ar ...

  4. IOS基础——IOS学习路线图(一)

    一.一个月 1.OC语法基础. 2.KVC和KVO 3.IOS UI基础 4.UI表视图与集合视图 5.UIStoryboard和autoLayout 6.Ipad API 二.10天 7.静态页面考 ...

  5. iOS基础 - iOS网络基础

    一.网络访问的四个步骤 l 第一步:确定地址URL l 第二步:建立请求 l 第三步:建立并启动连接 l 第四步:连接完成,处理结果 备注:URL,统一资源定位符(URL,英语Uniform Reso ...

  6. [ios基础]IOS应用程序的生命周期问题

    —程序的生命周期         a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程         b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...

  7. iOS开发Swift篇(02) NSThread线程相关简单说明

    iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在s ...

  8. 李洪强iOS开发Swift篇---12_NSThread线程相关简单说明

    李洪强iOS开发Swift篇---12_NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThre ...

  9. iOS面试必备-iOS基础知识

    近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...

随机推荐

  1. AS 断点调试 debug

    debug面板 点击下图工具栏开启调试会话 此种调试方式是通过冻结应用运行的状态,仿佛时间停止了一般,然后我们逐一观察此时程序的各个参数是否符合我们的预期. 这种调试方法适用于对时间不敏感的程序.也就 ...

  2. ViewPage 一次滑动多页

    效果 size是3的倍数时   其他情况下 初始化     private List<HonerUserBean> anchorList;     private ViewPager vp ...

  3. (转)SQL流程控制语句学习(一):变量及控制语句种类

    1.局部变量 用户自己定义的,称局部变量,以@标识. 作用范围:定义局部变量的批处理.存储过程.触发器和语句块 局部变量的定义: declare @局部变量名 数据类型 注意:变量的类型不能是text ...

  4. 反序列化 DateTime对象问题

      今天在Android的Json反序列化过程中,Date类型无法转化成自己想要的格式,鉴于之前在C#的反序列话中也遇到过这个问题,解决的同时,顺手做个总结,供自己及需要的人日后查阅.       将 ...

  5. SQL 关于有单引号数据更新的问题

    要把sql语句中包含有单引号的符号加入到数据库中的做法 )),''','123.com') 很简单就是加入id=''123''            0'0就可以写成'0''0'

  6. Swift隐式可选型简单介绍

    /* 隐式可选型 */ // 隐式可选型同样可以赋值为nil, 而且在后面对这个变量的使用也可以不用进行解包 var value: String! = nil // print(value) 这行代码 ...

  7. windows下安装apache笔记

    之前一直是用别人配置好的apache环境来开放,今天想自己安装配置下windows下的apache(nginx+fastcgi).mysql.php等. 虽然大部分时间是在搞前端开发,偶尔也要搞服务端 ...

  8. 自定义分页标签,并使分页标签能获得url中的参数

    如题,要实现一个分页功能,其次,要让分页标签“智能一点”,在分页时能自动带上url后面的参数 <tag> <description>分页标签</description&g ...

  9. [每日一题] OCP1z0-047 :2013-07-24 子查询――外查询与内查询的执行顺序

    一.Oracle的子查询分为两类分别是嵌套子查询和非嵌套子查询.所谓嵌套子查询是指,子查询是一个独立的查询不与外部查询相关,子查询将被先执行,而且只被执行一次,子查询执行完成后,再执行外部的查询,外部 ...

  10. mysql版本问题sql_mode=only_full_group_by

    set @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_ ...