17多线程原理 & NSThread
来源:互联网 发布:c语言求100以内素数 编辑:程序博客网 时间:2024/04/28 14:28
- 空得for循环不耗时
- NSLog是I/O操作,将数据输入或者输出到外接设备屏幕磁盘
- [self performSelectorInBackgroud:@selector(longOperation) withObject:nil];
- 多线程解决卡死屏幕
- 学习的目的将耗时操作放在另一个线程
- 进程是正在运行的应用程序
- 进程运行在受保护的内存空间内 各个进程是相互独立的
- 1个进程有多个线程组成线程是进程的基本单元一个进程的所有任务都在线程中执行的
- 一个进程可以加载多条线程 每个线程可以执行不同任务
- 线程解决的问题:阻塞问题 效率问题
- 单核cpu同一时间cpu只能处理一个线程
- 优点
- intmain 在主线程中执行 UI线程 因为都跟UI相关
- pthread 跨平台 一套通用的多线程API C生命周期程序员管理
- int -- = pthread_create(子线程的编号, 子线程的属性, 指定的子线程执行的函数,传入制定子线程执行的函数参数中的数据(函数的参数))
- NULL空指针 nil空对象
- 在MRC环境下,谁申请谁释放
- 对象方法
- 线程状态 alloc 的时候为新建状态 start之后进入可调度线程池中 就绪runnable -运行running 二者切换直到sleep方法或者等待同步锁 阻塞进入内存中 sleep结束或者得到同步锁就进入就绪状态 如果线程任务结束(正常销毁)或者异常强制退出(kill)
- [NSThread sleepForTimeInteval:1.0]; 使当前线程休眠间隔1s
- [NSThread exit] kill当前线程 不能在主线程中使用
- thread1.name 可以定位bug 如果有两个子线程不一定哪个蹦调用顺序跟代码顺序无关
- 设置线程的优先级 thread.threadPriority 0.0 - 1.0 默认为0.5
- %tu 查看 (自动判断是32还是 64长整形) %zd 是判断整形 [NSThread currentThread].stackSize/1024;
- 资源一个对象 一个变量 一个文件 内存中的都是资源
- 线程同时访问一块资源时可能出现问题
- 所有继承自NSObject都集成了一把锁 互斥索(同步锁)线程同步技术
- @synchronized(self){};能够保证被锁定的代码,同一时间,只能有一个线程可以访问/操作 锁定的范围是共享资源读写部分,而且锁定的范围必须小
- nonatomic非原子属性
- 合成指令
- 因为所有的UIKit类库不安全 所以要放在主线程中执行就保证只有一个线程执行安全
- loadView不需要super
- 重写loadView视图不会从sb中加载,当self.view == nil 的时候就会调用loadView
- NSURL *url = [NSURL URLWithString:@""];
- [self performSelectorOnMainThread:@selector(updataUI:)withObject:image waitUntilDone:NO]; 最后一个参数的意思是如果NO不用等待主线程结束
- vc -view -view.subview - imageView
- 根视图为强引用sb中拖线也是如此
- -fno-
- 每一次主线程的消息循环开始的时候会先创建自动释放池
- 环中创建了大量的临时变量 就需要手动创建一个自动释放池
- 野指针 空指针 僵尸指针 内存泄露 内存溢出
- for (int i = 0 , i < 120000000, ++i){
因为在短时间内切换线程执行造成同时执行的假象 如果线程过多就会造成资源消耗过多调度次数降低效率降低
切换线程之间就会保存上一次的内容
能适当提高程序的执行效率
能适当提高资源利用率cpu内存
线程上的任务执行完成之后,线程会自动销毁
缺点
开启线程需要执行一定的内存空间(默认状况下,每一个线程都占512KB)
(以前iOS主线程占1MB) 现在是512KB OSX 8MB
如果开启大量的线程,会占用大量的内存空间,降低程序的性能
线程越多,cpu在调用线程上的开销就越大
程序设计更加复杂,比如多线程的数据共享、线程间的通信
NSThread面向对象 OC 生命周期程序员管理
GCD旨在替代NSThread 充分利用多核 C 自动管理
NSOperation 基于GCD OC 自动管理
如果创建子线程成功返回 0 如果失败返回非0 因为成功的结果只有1个失败的原因有很多
void * (*) (void *)
返回值 函数名 函数的参数 void *标示可以指向任何地址的指针类似于oc的id
c语言_t 代表类型type
usr/ include 跨平台的 就包含在这里 无注释
在ARC环境下编译器在编译的时候会根据代码结构在合适的地方添加release retain, autorelease语句
ARC不会管理c语言申请的内存空间 c和oc混合开发的时候使用桥接的目的告诉编译器如何管理内存 :什么都不做
MRC不需要桥接因为是手动管理
NSThread *thread = [NSThread alloc] initwithtarget
[thread start];
类方法 detach分离 无法拿到线程对象无法手动开启子线程
[NSThread detachNewThreadSelector:]
隐式创建 定义的NSObject分类
[self performSelectorInBackgroud:@selector()---
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];有好多date方法可用 休眠到什么时间
线程的优先级并不能够决定线程之间的先后顺序,决定的是有更多的机会被cpu调度 开发建议thread.threadPriority千万不要设置 让cpu自己设置
self :锁对象任何继承自NSObject的对象都是锁对象内部都有一把锁默认是开启的
锁对象必须是全局的,不能是局部的
atomic 原子属性线程安全 单写多读 atomic本身就有一把锁 (自旋锁) 锁在setter方法里 是以死循环的方式等待锁的打开
默认是原子属性
@sythesize obj3 = _obj3;
所有NSMutable的类都是线程不安全的
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
self.myImageView.image = image;
这里边涉及到线程间的通信
controller -- strong - imageView 重复引用
[[Person alloc] init] autorelease];会被添加到最近一次创建的自动释放池 自动释放池会对person对象强引用person对象就是一个延缓释放的对象
在循环中创建了大量那个的无法及时释放的临时变量
nsstring *str = @"hello world"; str [strstringbyappendingformat:@"- %d",i];
str = [str uppercaseString]; 小写转大写
在循环中创建大量那个的无法及时释放的临时变量 在for循环中加入自动释放池
- 17多线程原理 & NSThread
- IOS多线程开发-NSThread原理及演示
- NSthread多线程的应用原理与总结
- 多线程 NSThread
- 多线程 NSthread
- NSThread 多线程
- 多线程-NSThread
- 多线程:NSThread
- 多线程NSthread
- 多线程NSThread
- 多线程NSThread
- 多线程----> NSThread
- 多线程:NSThread
- 多线程NSThread
- 多线程-NSthread
- 多线程-NSThread
- NSThread 多线程编程
- 多线程NSThread用法:
- FragmentTabhost学习笔记
- Genymotion出现”Unable to load VirtualBox engine“的问题解决
- float和double的内存布局
- 内存溢出java.lang.OutOfMemoryError解决方法
- MSDN中对MSBuild的解释页
- 17多线程原理 & NSThread
- poj1543Perfect Cubes
- 18.GCD
- delphi自定义颜色
- 19. NSOperation
- HashMap实现原理
- 初识C++之函数重载
- 20 sd_webImage 原理
- 控制器在退出的时候不执行dealloc方法