17多线程原理 & NSThread

来源:互联网 发布:c语言求100以内素数 编辑:程序博客网 时间:2024/04/28 14:28
    1. 空得for循环不耗时
    2. NSLogI/O操作,将数据输入或者输出到外接设备屏幕磁盘
    3. [self performSelectorInBackgroud:@selector(longOperation) withObject:nil];
    4. 多线程解决卡死屏幕
    5. 学习的目的将耗时操作放在另一个线程
    6. 进程是正在运行的应用程序
    7. 进程运行在受保护的内存空间内 各个进程是相互独立的
    8. 1个进程有多个线程组成线程是进程的基本单元一个进程的所有任务都在线程中执行的
    9. 一个进程可以加载多条线程 每个线程可以执行不同任务
    10. 线程解决的问题:阻塞问题 效率问题
    11. 单核cpu同一时间cpu只能处理一个线程

    因为在短时间内切换线程执行造成同时执行的假象 如果线程过多就会造成资源消耗过多调度次数降低效率降低

    切换线程之间就会保存上一次的内容

     

    1. 优点

    能适当提高程序的执行效率

    能适当提高资源利用率cpu内存

    线程上的任务执行完成之后,线程会自动销毁

     

    缺点

    开启线程需要执行一定的内存空间(默认状况下,每一个线程都占512KB)

    (以前iOS主线程占1MB 现在是512KB     OSX 8MB

    如果开启大量的线程,会占用大量的内存空间,降低程序的性能

    线程越多,cpu在调用线程上的开销就越大

    程序设计更加复杂,比如多线程的数据共享、线程间的通信

     

    1. intmain 在主线程中执行 UI线程 因为都跟UI相关

     

    1. pthread 跨平台 一套通用的多线程API  C生命周期程序员管理

    NSThread面向对象  OC 生命周期程序员管理 

    GCD旨在替代NSThread 充分利用多核自动管理

    NSOperation 基于GCD  OC 自动管理

     

    1. int -- =  pthread_create(子线程的编号子线程的属性指定的子线程执行的函数,传入制定子线程执行的函数参数中的数据(函数的参数))

    如果创建子线程成功返回 0  如果失败返回非因为成功的结果只有1失败的原因有很多

    1. NULL空指针 nil空对象

    void* (void *

     返回值  函数名   函数的参数   void *标示可以指向任何地址的指针类似于ocid

    c语言_t 代表类型type

    usr/ include  跨平台的 就包含在这里  无注释

     

    1. MRC环境下,谁申请谁释放

    ARC环境下编译器在编译的时候会根据代码结构在合适的地方添加release  retain, autorelease语句

    ARC不会管理c语言申请的内存空间 coc混合开发的时候使用桥接的目的告诉编译器如何管理内存  什么都不做

    MRC不需要桥接因为是手动管理

     

    1. 对象方法

    NSThread *thread = [NSThread alloc] initwithtarget

    [thread start];

    类方法  detach分离  无法拿到线程对象无法手动开启子线程

    [NSThread detachNewThreadSelector:]

    隐式创建   定义的NSObject分类

    [self performSelectorInBackgroud:@selector()---

     

    1. 线程状态 alloc 的时候为新建状态   start之后进入可调度线程池中 就绪runnable -运行running 二者切换直到sleep方法或者等待同步锁 阻塞进入内存中  sleep结束或者得到同步锁就进入就绪状态  如果线程任务结束(正常销毁)或者异常强制退出(kill)
    2. [NSThread sleepForTimeInteval:1.0]; 使当前线程休眠间隔1s

    [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];有好多date方法可用 休眠到什么时间

     

    1. [NSThread exit]  kill当前线程  不能在主线程中使用
    2. thread1.name  可以定位bug   如果有两个子线程不一定哪个蹦调用顺序跟代码顺序无关
    3. 设置线程的优先级  thread.threadPriority    0.0 - 1.0 默认为0.5

    线程的优先级并不能够决定线程之间的先后顺序,决定的是有更多的机会被cpu调度  开发建议thread.threadPriority千万不要设置 cpu自己设置

     

    1. %tu 查看  (自动判断是32还是 64长整形)  %zd 是判断整形  [NSThread currentThread].stackSize/1024;
    2. 资源一个对象 一个变量 一个文件   内存中的都是资源
    3. 线程同时访问一块资源时可能出现问题
    4. 所有继承自NSObject都集成了一把锁 互斥索(同步锁)线程同步技术
    5. @synchronized(self){};能够保证被锁定的代码,同一时间,只能有一个线程可以访问/操作     锁定的范围是共享资源读写部分,而且锁定的范围必须小

    self :锁对象任何继承自NSObject的对象都是锁对象内部都有一把锁默认是开启的

    锁对象必须是全局的,不能是局部的

     

    1. nonatomic非原子属性

    atomic 原子属性线程安全  单写多读  atomic本身就有一把锁 (自旋锁锁在setter方法里   是以死循环的方式等待锁的打开

    默认是原子属性

     

    1. 合成指令

    @sythesize obj3 = _obj3;

     

    1. 因为所有的UIKit类库不安全 所以要放在主线程中执行就保证只有一个线程执行安全

    所有NSMutable的类都是线程不安全的

     

    1. loadView不需要super

     

    1. 重写loadView视图不会从sb中加载,self.view == nil 的时候就会调用loadView

     

    1. NSURL *url = [NSURL URLWithString:@""];

    NSData *data = [NSData dataWithContentsOfURL:url];

    UIImage *image = [UIImage imageWithData:data];

    self.myImageView.image = image;

     

    1. [self performSelectorOnMainThread:@selector(updataUI:)withObject:image waitUntilDone:NO];  最后一个参数的意思是如果NO不用等待主线程结束

       这里边涉及到线程间的通信

     

    1. vc -view -view.subview - imageView

    controller --  strong - imageView 重复引用

     

    1. 根视图为强引用sb中拖线也是如此

     

    1. -fno-

    [[Person alloc] init] autorelease];会被添加到最近一次创建的自动释放池 自动释放池会对person对象强引用person对象就是一个延缓释放的对象

     

    1. 每一次主线程的消息循环开始的时候会先创建自动释放池
    2.  环中创建了大量的临时变量 就需要手动创建一个自动释放池

    在循环中创建了大量那个的无法及时释放的临时变量

     

    1. 野指针 空指针 僵尸指针  内存泄露 内存溢出
    2. for (int i = 0 , i < 120000000, ++i){

    nsstring  *str = @"hello world"; str [strstringbyappendingformat:@"- %d",i];

    str = [str uppercaseString]; 小写转大写

     

    在循环中创建大量那个的无法及时释放的临时变量 for循环中加入自动释放池

     

     

0 0
原创粉丝点击