17多线程原理 & NSThread

    1. 空得for循环不耗时
    2. NSLog I/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. int main  在主线程中执行 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语言申请的内存空间  c oc 混合开发的时候 使用桥接的目的 告诉编译器 如何管理内存   什么都不做

    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 [str stringbyappendingformat:@"- %d",i];

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

     

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

     

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值