运行循环(RunLoop):
保证程序不退出 (死循环)
监听所有的事件 点击,触摸等 网络数据加载完成
特性:没有事件的时候 会进行休眠 一旦监听到事件 会立即响应
每一个线程都会有一个runLoop 默认是关闭的,只有主线程的runloop 会启动
当一个程序运行起来的时候,只有主线程的消息循环是默认开启的,子线程的消息循环默认是关闭的若想要去让子线程需要实现下面这个方法
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(demo) object:nil];
[thread start];
// 输入源事件
[self performSelector:@selector(demo2) onThread:thread withObject:nil waitUntilDone:NO];
- (void)demo{
// 若是把这个循环添加在这,那么下面那句永远不会执行,因为运行循环就是一个死循环..程序也不死
1. //1. [[NSRunLoop currentRunLoop]run];
[[NSRunLoop currentRunLoop]runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
NSLog(@"haha");
}}
- (void)demo2{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"demo2");
}}
/输入事件:
11.输入源事件
鼠标事件
键盘事件
[self performSelector:@selector(demo2) onThread:thread withObject:nil waitUntilDone:NO];
2.定时器事件
自动释放池作用: 延迟释放 : 所有用类方法实例出来的对象 都是延迟释放的 所有延迟释放的对象 在出了作用域之后 会被自动添加到最新的自动释放池中 不会立即释放 自动释放池释放后会向池子里的所有对象发送release消息 关系 1.开始 运行状态处于休眠状态 2.事件触发,运行循环开始工作 3.创建自动释放池 4,所有事件创建的对象都放在的自动释放池中 5.(事件完成)自动释放池结束 向对象发送一次release消息 6运行循环又进入到休眠状态 当事件启动 是RunLoop创建的自动释放池 ARC 中 自动释放池也是工作的