RunLoop

自动释放池什么时候创建和释放

1.第一次创建, 是在RunLoop进入的时候创建  对应的状态 = kCFRunLoopEntry

2.最后一次释放, 是在RunLoop退出的时候  对应的状态 = kCFRunLoopExit

3.其它创建和释放

* 每次睡觉的时候都会释放前自动释放池, 然后再创建一个新的

_wrapRunLoopWithAutoreleasePoolHandler activities = 0x1,

1  = kCFRunLoopEntry  进入RunLoop  创建自动释放池

_wrapRunLoopWithAutoreleasePoolHandler activities = 0xa0,

160 = kCFRunLoopBeforeWaiting  即将进入睡眠 ,先释放上一次创建的自动释放池, 然后再创建一个新的释放池

+

kCFRunLoopExit 即将退出RunLoop  释放自动释放池

子线程创建注意事项:

1、子线程的NSRunLoop 需要手动创建

2、子线程的NSRunLoop 需要手动开启

3、 如果子线程的NSRunLoop没有设置source or timer,那么子线程的NSRunLoop会立即关闭

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:YES];

[runLoop addTimer:timer forMode:NSRunLoopCommonModes];

// 启动RunLoop

[runLoop run];

2.自动释放池什么时候释放?

通过Observer监听RunLoop的状态

应用场景:

3.1 开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发来消息,处理其他事件)

       1)在子线程中开启一个定时器

       2)在子线程中进行一些长期监控

3.2 可以控制定时器在特定模式下执行

3.3可以让某些事件(行为、任务)在特定模式下执行

3.4可以添加Observer监听RunLoop的状态,比如监听点击事件的处理(在所有点击事件之前做一些事情)

你可能感兴趣的:(RunLoop)