perform执行时机

在iOS开发中,大家都经常用到performSelector函数,但是他们的执行时机是怎么样的,这里做个简单的介绍。

首先如果我们在主线程调用和在子线程调用下面的方法有什么区别呢?

[self performSelector:@selector(testttt) withObject:nil];

试过后,就知道在主线程会执行testttt函数,而在子线程是不会执行的呢,为什么呢?这里就要涉及到runloop了,因为主线程的runloop默认是运行的,但是子线程的runloop默认是没有的,需要自己去创建并执行,通常调用如下

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
子线程在没有第一次调用runloop是会先创建,然后在run。

更多可以参考这里

runloop监控主线程

前几天读了关于微信监控内存卡顿的文章,其中介绍可以同过监控主线程runloop的时间来记录卡顿,当cpu为100%且runloop运行2秒以上时,就会把当前堆栈的所有信息给dump下来,然后上传发服务器,后续再继续进行分析。

loadView踩坑

昨天在开始回归的时候,发现预订的订座按钮没有显示,而且big鹏还发现从NVTableView转成NVSensibleTableView也失败,于是就会调用

方法1:
[((NVSensibleTableView *)self.tableView) setTouchDownTarget:self selector:@selector(touchDownTableView)];

函数就会crash,这个原因是:

  1. NVTableView有个setTouchDownTarget:selector:的Categroy,但是参数不一致
  2. NVTableView转换NVSensibleTableView失败,即tableView根本不是NVSensibleTableView子类,所以无法调用他的setTouchDownTarget:selector:方法,所以崩溃。

创建一个显示FPS的label

如何创建一个实时显示FPS的Label呢,看了Nova的代码,发现是主要是采用CADisplayLink实现,至于CADisplayLink主要作用是什么,这里简单介绍下:

CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒。