iOS-多线程Day01

Posted northwan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS-多线程Day01相关的知识,希望对你有一定的参考价值。

# 栈区/堆区/常量区
- 操作内存的栈区速度很快;栈区存储空间地址是连续的
- 操作内存的常量区速度很快;内存空间只开辟一次;
- 操作内存的堆区速度相对栈区和常量区要慢些;堆区内存空间不连续,需要寻址
`` // 存储在栈区` int num = 10;`
// 存储在常量区 ` NSString *str1 = @"hello";`
// 存储在堆区`NSString *str2 = [NSString stringWithFormat:@"hello_%d",i];`
``

#创建线程的三种方式
- `NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo:) object:@"alloc"];`
- `[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"detach"];`
- ` [self performSelectorInBackground:@selector(demo:) withObject:@"perform"];`

#target和selector的关系
- 执行哪个对象上的哪个方法.

#@synthesize是啥?什么情况下使用?
- 首先一旦重写来属性的setter和getter方法后,系统不再自动生成带下划线的成员变量,而这行代码会创造一个带下划线前缀的实例变量名,同时使用这个属性生成getter 和 setter 方法。
- 使用`@synthesize` 只有一个目的——给实例变量起个别名,或者说为同一个变量添加两个名字。
- 如果要阻止自动合成,记得使用 `@dynamic` 。经典的使用场景是你知道已经在某处实现了getter/setter 方法,而编译器不知道的情况。
- 如何使用: `@synthesize obj2 = _obj2;`

#线程的状态-生命周期
- start :就绪状态,等待被CPU调用,当被调用的时候为运行状态
- sleep/加锁:阻塞状态
- exit:完全杀死(非正常死亡),*不要在主线程中调用*

#线程属性(name,stackSize,isMainThread,threadPriority,qualityOfService)
- `name` - 线程名称
- 设置线程名称可以当线程执行的方法内部出现异常时,记录异常和当前线程
- `stackSize` - 栈区大小
- 默认情况下,无论是主线程还是子线程,栈区大小都是 512K
- 栈区大小可以设置 `[NSThread currentThread].stackSize = 1024 * 1024;`
- 必须是 4KB 的倍数
- `isMainThread` - 是否主线程
- `threadPriority` - 线程优先级
- 优先级,是一个浮点数,取值范围从`0~1.0`
- `1.0`表示优先级最高
- `0.0`表示优先级最低
- 默认优先级是 `0.5`
- **优先级高只是保证 CPU 调度的可能性会高**
- `qualityOfService` - 服务质量(ios 8.0 推出)
- NSQualityOfServiceUserInteractive - 用户交互,例如绘图或者处理用户事件
- NSQualityOfServiceUserInitiated - 用户需要
- NSQualityOfServiceUtility - 实用工具,用户不需要立即得到结果
- NSQualityOfServiceBackground - 后台
- NSQualityOfServiceDefault - 默认,介于用户需要和实用工具之间

#NSUInteger和NSInteger的区别

技术分享图片

- `NSInteger `有符号整数(有正负数)用 `%zd`
- `NSUInteger` 无符号整数(没有负数)用 `%tu`
- 是为了自适应32位和64位CPU的架构.

#线程安全-资源共享(互斥锁小结)
- `@ synchronized`互斥锁,使用了线程同步技术
- 同步锁/互斥锁:可以保证被锁定的代码,同一时间,只能有一个县城可以操作
- `self`:锁对象,任何继承自NSObject的对象都可以是锁对象,因为内部都有一把锁,而且是默认开着的
- 锁对象:一定要是全局的锁对象,要保证所有的线程都能访问,self是最方便使用的锁对象
- 互斥锁锁定你的范围应该尽量小,但是一定要锁住资源的读写部分
- 枷锁后程序的执行效率比不加锁的时候要低,因为线程要的等待解锁
- 牺牲了性能保证了安全

#原子属性和非原子属性-以及自旋锁
- `nonatomic` : 非原子属性
- `atomic` : 原子属性
- 线程安全的,针对多线程设计的属性修饰符,是默认值.
- 特点 : 单写多读
- 单写多读 : 保证同一时间,只有一个线程能够执行setter方法,但是可以有多个线程执行getter方法.
- atomic 属性的setter里面里面有一把锁,叫做自旋锁.
- 原子属性的setter方法是线程安全的;但是,getter方法不是线程安全的.
- `nonatomic`和`atomic`对比:
- `nonatomic `: 非线程安全,适合内存小的移动设备.
- `atomic` : 线程安全,需要消耗大量的资源.性能比非原子属性要差一点

#loadView的注意事项
1. 用于加载指定的视图,一旦重写了这个方法,Storyboard里面就不会去加载根视图了
2. 先于`viewDidLoad`调用
3. 不可以调用`super.loadView()`
4. 当`self.view == nil`时回调用此方法

#ViewController的生命周期

技术分享图片

- `loadView`:用于加载制定的根试图
- ` viewDidLoad`:试图加载完毕
- `viewWillAppear`:界面即将显示在屏幕上
- `viewDidAppear`:界面已经完全渲染在屏幕上
- `viewWillDisappear`:界面即将从屏幕上消失
- `viewDidDisappear`:界面已经完全消失
- `dealloc`:控制器销毁

#什么时候用`stong`/`weak`
- 根视图和父视图需要使用strong; 子视图使用weak
- 没有强指针指向的对象使用strong; 有强指针指向的可以可以weak

#线程间通信(怎么做到的?为什么能通信?)
- 因为多线程共享地址空间和数据空间, 一个线程的数据可以直接提供给其他线程使用,叫做线程间通信
- `performSelectorInBackground`
- `performSelectorOnMainThread`








































































以上是关于iOS-多线程Day01的主要内容,如果未能解决你的问题,请参考以下文章

REDIS01_单线程的概述多线程的引入概述IO多路复用如何开启多线程

Python全栈开发-Day10-进程/协程/异步IO/IO多路复用

REDIS01_单线程的概述多线程的引入概述IO多路复用如何开启多线程

day9-Python学习笔记(二十二)多线程,多进程

iOS底层探索之多线程—GCD源码分析(调度组)

Day765.Redis 6.0的新特性:多线程客户端缓存与安全 -Redis 核心技术与实战