iOS run loop(NSRunLoop)和线程的一些需要注意的细节

1、一个 run loop 是用来在线程上管理事件异步到达的基础设施。一个 run loop 为 线程监测一个或多个事件源。当事件到达的时候,系统唤醒线程并调度事件到 run loop,然后分配给指定程序。如果没有事件出现和准备处理,run loop 把线程置于休眠状态。 

2、向主线程发送消息,将唤醒runloop。

3、iOS开辟线程占用的空间情况

    线程创建的成本

kernel data structures    约1KB
Stack space                   512KB(secondary threads) 
                                              1MB(iOS main thread)
Creation time                约90 microseconds

       当编写线程代码时另外一个需要考虑的成本是生产成本。设计一个线程应用程序 有时会需要根本性改变你应用程序数据结构的组织方式。要做这些改变可能需要避免 使用同步,因为本身设计不好的应用可能会造成巨大的性能损失。设计这些数据结构 和在线程代码里面调试问题会增加开发一个线程应用所需的时间。然而避免这些消耗 的话,可能在运行时候带来更大的问题,如果你的多线程花费太多的时间在锁的等待 而没有做任何事情。

 

4、线程使用一个平凡的内存量,它的一些有线, 所以释放一个空闲线程,不仅有助于降低您的应用程序的内存占用,它也释放出更多的物理 内存使用的其他系统进程。线程占用一定量的内存,其中一些是有线的,所以释放空闲线程 不但帮助你减少了你应用程序的内存印记,而且还能释放出更多的物理内存给其他系统进程 使用。

5、使用NSThread的类方法和实例方法创建的是一个脱离的线程(Datached thread) ,一个脱离线程,当线程退出的时候,线程占用的资源会由系统自动回收。

6、脱离线程(Datached thread)补充说明

    脱离线程允许系统在线程完成的时候立 即释放它的数据结构。脱离线程同时不需要显示的和你的应用程序交互。意味着线程 检索的结果由你来决定。相比之下,系统不回收可连接线程(Joinable thread)的 资源直到另一个线程明确加入该线程,这个过程可能会阻止线程执行加入。

    可以认为可连接线程类似于子线程。虽然你作为独立线程运行,但是可连接线 程在它资源可以被系统回收之前必须被其他线程连接。可连接线程同时提供了一个显 示的方式来把数据从一个正在退出的线程传递到其他线程。在它退出之前,可连接线 程可以传递一个数据指针或者其他返回值给 pthread_exit 函数。其他线程可以通过 pthread_join 函数来拿到这些数据。

    重要:

           在应用程序退出时,脱离线程可以立即被中断,而可连接线程则不可以。每个可连接 线程必须在进程被允许可以退出的时候被连接。所以当线程处于周期性工作而不允许被中断的时 候,比如保存数据到硬盘,可连接线程是最佳选择。


7、runloop 接受的消息

    ( input source )输入源和定时源(Timer source)以及注册监听的消息

     输入源-》传递异步事件,通常消息来自于其他线程或程序。

     定时源-》则传递同步事件,发生在特定时间或者重复的时间间隔。两种源都使用程序的某一特 定的处理例程来处理到达的事件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值