一、什么runloop
从字面意思就是运行循环,他的作用体现在保持程序的持续运行,处理app中的各种事件(比如触摸事件、定时器事件、selector事件),节省cpu资源,提高程序性能:做事的时候做事,没事的时候睡眠。
我们的main函数里就启动了个runloop,所以程序运行起来后并不会马上退出,保持持续运行的状态。
runloop的逻辑处理:
二、runloop与线程
1、每条线程都有唯一的一个与之对应的runloop对象。
2、主线程的runloop已经自动创建好了,子线程的runloop需要主动创建。
3、runloop在第一次获取时创建,在线程结束时销毁。
三、获取runloop对象
[NSRunLoopcurrentRunLoop];// 获得当前线程的RunLoop对象
[NSRunLoopmainRunLoop];// 获得主线程的RunLoop对象
CFRunLoopGetCurrent();// 获得当前线程的RunLoop对象
CFRunLoopGetMain();// 获得主线程的RunLoop对象
三、runloop相关类
四、runloop的应用举例(线程常驻)
runloop有很多用处,我们规定某个操作在什么模式下进行,下面我们简单看看常驻线程的使用。
我们的线程在使用一次后就会消亡,并且无法重新启动,如果我们希望某个子线程不死,我们可以看如下代码实现:
- (void)viewDidLoad {
[super viewDidLoad];
self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil];
[self.thread start];
}
- (void)test{
NSLog(@"test");
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
}
-(void)test1{
NSLog(@"----%@",[NSThread currentThread]);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self performSelector:@selector(test1) onThread:self.thread withObject:nil waitUntilDone:NO];
}
@end
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];