自动释放池什么时候创建和释放
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的状态,比如监听点击事件的处理(在所有点击事件之前做一些事情)