什么是runtime

runtime就是运行时,是系统在运行时的一些动态机制,它是一套底层的API,我们平时编写的OC代码,最终会转换为runtime实现。

runtime的作用

  • 可以利用runtime获取一个类的属性列表,可以通过runtime拿到一个类的所有成员属性。

   首先要导入runtime.h的头文件

  • #import <objc/runtime.h>

    此处以获取Person类(事先已经定义好,有三个成员属性age、name、height)的成员变量为例,代码如下

  •    // 定义一个无符号整型数字(用于记录类中的成员变量的个数)
    unsigned int count = 0; // 使用这个runtime函数,可以获取一个类的成员变量,返回一个ivar类型的数组
    Ivar *ivars = class_copyIvarList([Person class], &count);
    NSLog(@"%d",count); // count打印出来为3,即(person类的成员变量个数)
    for (int i = 0;i < count;i++) {
    // 获取每个成员变量
    Ivar memmber = ivars[i];
    const char *name = ivar_getName(memmber);
    NSLog(@"%s",name);
    }

    打印结果为:

    2016-01-22 08:43:37.292 c语言函数等[2528:16328] _age

    2016-01-22 08:43:37.293 c语言函数等[2528:16328] _name

    2016-01-22 08:43:37.293 c语言函数等[2528:16328] _height

    ,第5行class_copyIvarList([Person class], &count) 这个函数,第一个参数是要获取成员变量指定的那个类,第二个参数需要传递一个整型数据地址,函数内部会返回一个整数也就是指定类的成员属性个数。

  • runtime可以动态的给一个类增加方法,也可以交换自定义的方法和系统的方法的实现。

   例如在整个程序中想给 imageNamed: 这个方法添加一些额外的功能,这时候可以写一个方法来替换系统的 imageNamed:

  •  #import <objc/runtime.h>
    
     @implementation UIImage (Extension)
    /**
    * 只要分类被装载到内存中,就会调用1次
    */
    + (void)load
    {
    Method otherMehtod = class_getClassMethod(self, @selector(imageWithName:));
    Method originMehtod = class_getClassMethod(self, @selector(imageNamed:));
    // 交换2个方法的实现
    method_exchangeImplementations(otherMehtod, originMehtod);
    }

    可以在UIImage的分类中,使用这个runtime的 method_exchangeImplementations(otherMehtod, originMehtod) 函数,将系统的方法 imageNamed: 和自定义的方法 imageWithName: 交换实现,之后当你调用这个方法 imageNamed:时,就会使用自定义方法 imageWithName: 的实现。

什么是runloop

  1. 其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer),能让线程不被系统终止
  2. 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法)
  3. RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop

runloop的作用

  • 可以使用runloop,在一个子线程中长期监控某个事件
  •  - (void)viewDidLoad {
    [super viewDidLoad];
    // 开启一个线程让它执行run方法,如果run方法过了,线程就会死掉
    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    [self.thread start];
    }
    - (void)run
    {
    NSLog(@"run----%@",[NSThread currentThread]);
    // 给线程执行的方法添加运行时,添加source1 和timer,让这个进程不死,并在没有任务时进入休眠状态
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
    // 可以在这里添加要循环执行的代码
    }

    上面的代码如果不加runloop,run方法执行完,self.thread这个线程就会被释放

  • 可以让某些事件(行为、任务)在特定模式下执行(例如轮播广告,在用户拖动图片的时候,不去循环轮播图片(不做定时任务),等用户松开手指时才开始计算循环周期(开始定时任务))
  • runloop常用的三种模式:
  1. NSDefaultRunLoopMode:runloop默认的模式,程序启动模式主线程的runloop就是在NSDefaultRunLoopMode模式下运行的。
  2. UITrackingRunLoopMode:runloop在用户点击或触摸屏幕时,会自动切换到该模式。
  3. NSRunLoopCommonModes:指标记为common modes的所有模式,即前两者的集合。
     - (void)timer
    {
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    // 定时器只运行在NSDefaultRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    } - (void)run
    {
    NSLog(@"----run");
    }

    如上代码,在 NSDefaultRunLoopMode模式下添加一个定时器任务(每2秒打印一次run这个方法),程序一启动后,是NSDefaultRunLoopMode,所以一直打印,当用户触摸屏幕上的UIScrollView时,此时自动切换到UITrackingRunLoopMode,定时器停止工作,当用户松开手时,定时器重新启动,run方法继续执行打印。如果将

    如果将上面代码加入到NSRunLoopCommonModes,那么不管用户是否触摸UIScrollView,定时器都会正常工作。


【iOS之runtime、runloop】的更多相关文章

  1. 关于iOS的runtime

    runtime是一个很有意思的东西,如果你学iOS开发很经常就会用到或被问到runtime.那么runtime是什么呢,如何去了解它. runtime:中文名 运行时,系统在编译时留下的一些 类型,操 ...

  2. ios中的RunLoop 和 android 中的Looper

    今天写android程序,用到了Handler,晚上回来查阅资料,发现了Looper这个概念. 看了一下网上关于Looper的资料,发现这个Looper跟ios中的Runloop基本的理念完全一致! ...

  3. iOS 深入理解RunLoop

    RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...

  4. ios之runtime学习

    今天学习了一下ios的runtime,看了其他博主的博客写的很不错,自己就不班门弄斧了,仅在此转载: 1.关于oc中类和元类:http://husbandman.diandian.com/post/2 ...

  5. IOS 中runtime 不可变数组__NSArray0 和__NSArrayI

    IOS 中runtime 不可变数组__NSArray0 和__NSArrayI 大家可能都遇到过项目中不可变数组避免数组越界的处理:runtime,然而有时候并不能解决所有的问题,因为类簇不一样 # ...

  6. iOS运用runtime全局修改UILabel的默认字体

    iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍 在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊 ...

  7. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

  8. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  9. iOS进阶五-RunLoop

    简介 RunLoop 运行循环.跑圈 RunLoop的作用主要体现在三方面: 1.保持程序持续运行 2.处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 3.节省CPU资源,提 ...

  10. 关于 IOS Runtime Runloop 2

    Runtime 也就是运行时组件,一个纯C语言写的基础库. 我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码 Objective-C编写出来的程序必须得到ru ...

随机推荐

  1. Hadoop错误

    1.50030页面起不来 $bin/hadoop jobtracker 出现:…… SHUTDOWN_MSG: Shutting down JobTracker at node0/ 解决办法:按提示信 ...

  2. sqlserver2012 评估期已过问题处理

    由于之前安装sqlserver2012忘记输入序列号,现在出现评估期已过的问题,网上忙活半天,才解决,发现网上叙述都很凌乱,而且只有大意,新手很难操作,所以把我操作的过程分享给大家 1 开始菜单找到s ...

  3. linux初识-02常用命令

    文件目录操作命令 ls 现实文件和目录列表 ls -l 列出文件的详细信息 ls -a 列出当前目录所有文件 包括隐藏的文件 mkdir 创建目录 -p 父目录不存在的情况下先生成父目录 cd 切换目 ...

  4. epoll 中EPOLLIN 和 EPOLLOUT

    epoll主要是事件回调运行的,我们使用socket的时候主要使用两个事件 EPOLLOUT事件:EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件:1.某次 ...

  5. CentOS 7 之几个新特性(转)

    上篇我们讲到默认没有ifconfig是centos7的新特性,所以我特意上网搜索了一下其新特性,找到一篇文章,现转过来. centos最小好化安装没有ifconfig命令 刚安装了centos7.0, ...

  6. php函数整理

    php usleep() 函数延迟代码执行若干微秒. unpack() 函数从二进制字符串对数据进行解包. uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. time_sleep_ ...

  7. Ajax 技术原理(转)

    Ajax 技术原理 2010-01-04 原文出处:http://www.nowamagic.net/ajax/ajax_AjaxPrinciple.php 在写这篇文章之前,曾经写过一篇关于AJAX ...

  8. Ubuntu12.04 下搭建Java开发环境

    1:下载 jdk-7u40-linux-i586.tar.gz. 2:解压安装. (1)创建jvm目录:sudo mkdir -p /usr/lib/jvm (2)sudo tar zxvf ./ j ...

  9. [LeetCode 120] - 三角形(Triangle)

    问题 给出一个三角形,找出从顶部至底部的最小路径和.每一步你只能移动到下一行的邻接数字. 例如,给出如下三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 从顶部至底部的最 ...

  10. 数字签名.sys文件的步骤

    ------------------------------------------------------------------------------ 1. 双击MSCrossCert.crt文 ...