iOS 多线程笔记_( 1 )

1、一个NSThread对象就代表一条线程

创建、启动线程
NSThread *thread = [[NSThread alloc] initWithTarget:self start];selector:@selector(run) object:nil];

[thread

// 线程一启动,就会告诉 CPU 准备就绪,可以随时接受 CPU 调度! CPU 调度当前线程之后,就会在线程thread中执行self的run方法

主线程相关用法

  • (NSThread *)mainThread; // 获得主线程
  • (BOOL)isMainThread; // 是否为主线程
  • (BOOL)isMainThread; // 是否为主线程

2、获得当前线程

NSThread *current = [NSThread currentThread];

线程的调度优先级

  • (double)threadPriority;
  • (BOOL)setThreadPriority:(double)p;
  • (double)threadPriority;
  • (BOOL)setThreadPriority:(double)p;
  • 调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高

线程的名字

  • (void)setName:(NSString *)n;
  • (NSString *)name;

三、创建线程后自动启动线程

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

隐式创建并启动线程

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

上述2种创建线程方式的优缺点

优点:简单快捷

缺点:无法对线程进行更详细的设置

四、互斥锁使用格式

@synchronized(锁对象) { // 需要锁定的代码 }

注意:锁定1份代码只用1把锁,用多把锁是无效的

互斥锁的优缺点

优点:能有效防止因多线程抢夺资源造成的数据安全问题

缺点:需要消耗大量的CPU资源

互斥锁的使用前提:多条线程抢夺同一块资源

相关专业术语:线程同步
线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
互斥锁,就是使用了线程同步技术

五、OC在定义属性时有nonatomic和atomic两种选择

  • atomic:原子属性,为setter方法加锁(默认就是atomic)

    nonatomic:非原子属性,不会为setter方法加锁

  • nonatomic和atomic对比

    atomic:线程安全,需要消耗大量的资源

    nonatomic:非线程安全,适合内存小的移动设备

  • iOS开发的建议

    所有属性都声明为nonatomic

    尽量避免多线程抢夺同一块资源

    尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

六、既然多线程这么爽, 线程是不是越多越好呢?

<1> 开启线程需要消耗一定的内存(默认情况下,线程占用 512KB 的栈区空间);
<2> 会使应用程序增加很多代码!代码变多之后,程序复杂性就会提高!
<3> CPU 在多条线程之间来回切换!线程越多, CPU就越累!

建议: 在移动应用的开发中; 一般只开3~5条线程!

七、重点:为什么要使用桥接?你是怎么进行混合开发的?

{

    桥接 (__bridge) :C 和 OC 之间传递数据的时候需要使用桥接! why?为什么呢?
    
    1.内存管理:
        在 OC 中,如果是在 ARC环境下开发,编译器在编译的时候会根据代码结构,自动为 OC 代码添加 retain/release/autorelease等.   ----->自动内存管理(ARC)的原理!
    
        但是, ARC只负责 OC 部分的内存管理!不会负责 C 语言部分代码的内存管理!
        也就是说!即使是在 ARC 的开发环境中!如果使用的 C 语言代码出现了 retain/copy/new/create等字样呢!我们都需要手动为其添加 release 操作!否则会出现内存泄露!
    
        在混合开发时(C 和 OC 代码混合),C 和 OC 之间传递数据需要使用 __bridge 桥接,目的就是为了告诉编译器如何管理内存

        在 MRC中不需要使用桥接! 因为都需要手动进行内存管理!
    
    2.数据类型转换:
    
        Foundation 和 Core Foundation框架的数据类型可以互相转换的
        Foundation :  OC
        Core Foundation : C语言
    
        NSString *str = @"123"; // Foundation
        CFStringRef str2 = (__bridge CFStringRef)str; // Core Foundation
        NSString *str3 = (__bridge NSString *)str2;
            CFArrayRef ---- NSArray
            CFDictionaryRef ---- NSDictionary
            CFNumberRef ---- NSNumber

        Core Foundation中手动创建的数据类型,都需要手动释放

        CGPathRef path = CGPathCreateMutable();
        CGPathRetain(path);

        CGPathRelease(path);
        CGPathRelease(path);

    3.桥接的添加:
        利用 Xcode 提示自动添加! --简单/方便/快速
    /**
     凡是函数名中带有create\copy\new\retain等字眼, 都应该在不需要使用这个数据的时候进行release
     GCD的数据类型在ARC环境下不需要再做release
     CF(Core Foundation)的数据类型在ARC\MRC环境下都需要再做release
    */    
        
}

八、iOS中多线程实现方案2.NSThread - 1基本使用

重点:1.三种创建线程! 2.常用方法!
{
    1.NSThread: 一个 NSThread 就代表一个线程对象!
    // OC语言 / 使用面向对象 / 需要手动管理线程生命周期(创建/销毁等)
    
    2.三种多线程实现方案:
    
    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];
    
    3.常用方法:
     名字/获得主线程/获得当前线程/阻塞线程/退出线程
    // 不常用: 栈区大小/优先级
    1> 获得当前线程
    + (NSThread *)currentThread;
    
    2> 获得主线程
    + (NSThread *)mainThread;
    
    3> 睡眠(暂停)线程
    + (void)sleepUntilDate:(NSDate *)date;
    + (void)sleepForTimeInterval:(NSTimeInterval)ti;
    
    4> 设置线程的名字
    - (void)setName:(NSString *)n;
    - (NSString *)name;
}

九、重点:1.线程同步技术! 2.理解资源共享

{
    当多条线程访问同一块资源的时候,就会出现数据错乱和数据安全的问题!
    
    1.ATM机取钱; 卖票;
    
    2.解决方案:互斥锁 @synchronized(锁对象self){  /*需要锁住的代码,越少越好!*/ }   ------- 厕所加锁!
    
    注意:锁定一份代码只用一把锁,用多把锁是无效的!
    
    优点:能有效防止因多线程抢夺资源而引起的数据安全问题!
    缺点:需要消耗大量的CPU资源!
    
    结论:尽量少加锁!互斥锁的使用前提是多条线程抢夺同一块资源!
    
    3.添加互斥锁技巧: [[NSUserDefaults standardUserDefaults] synchronize];
    
    4.线程同步技术:  ----- 互斥锁使用了线程同步技术!
    
    多条线程在同一条线上按顺序执行任务!
    
    5.线程安全:保证多条线程进行读写操作,都能够得到正确的结果!
    
    用 '锁' 来实现线程安全!
}

十、为什么要在主线程更新UI?

因为UIKit 框架都不是线程安全的!为了得到更好的用户体验,UIKit框架牺牲了线程安全;

所以我们要在主线程更新UI;

十一、下载图片 更新 UI

/*------------------------- iOS中多线程实现方案2.NSThread - 4线程间通信 -------------------------*/
1.下载图片? 更新 UI?
{
    1.后台线程(子线程)下载图片;
    
    [self performSelectorInBackground:@selector(downloadImage) withObject:nil];
    
    2.主线程更新 UI.
    
    线程间通信常用方法:
    
    // 最后一个参数:是否等待调用方法执行结束!
    <1>[self performSelectorOnMainThread:@selector(setImageWithImage:) withObject:nil waitUntilDone:YES];
    
    <2>[self performSelector:@selector(setImageWithImage:) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
}

十二、线程状态

线程状态.png

十三、cell下载图片思路

cell下载图片思路 – 无沙盒缓存.png
cell下载图片思路 – 有沙盒缓存.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 一、多线程基础 基本概念 进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且...
    AlanGe阅读 519评论 0 0
  • 多线程基本概念 单核CPU,同一时间cpu只能处理1个线程,只有1个线程在执行 。多线程同时执行:是CPU快速的在...
    WeiHing阅读 678评论 1 5
  • .一.进程 进程:是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空...
    IIronMan阅读 4,429评论 1 33
  • 张大爷今年70多岁了。家住长春宽城区。长春不是70岁以上老人坐公交车免费么。张大爷天天坐车溜达。 张大爷身板硬朗没...
    春韵留芳阅读 661评论 2 1
  • 玩弄我很有意思是吗?! 他猩红着双眼,揪着她的领子,愤怒的质问着,纤弱的身躯在那件很大的衣服中显得...
    千色sai阅读 211评论 1 1