美文网首页
iOS-面试题 runloop(夯实基础学习笔记-温故知新3)

iOS-面试题 runloop(夯实基础学习笔记-温故知新3)

作者: 朱允见 | 来源:发表于2020-06-20 16:33 被阅读0次

    讲讲 RunLoop,项目中有用到吗?
    runloop内部实现逻辑?
    runloop和线程的关系?
    timer 与 runloop 的关系?
    程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?
    runloop 是怎么响应用户操作的, 具体流程是什么样的?
    说说runLoop的几种状态
    runloop的mode作用是什么?

    1. 什么是runloop?
    • 运行循环

    • 在程序运行过程中循环做一些事情

    • 应用范畴

      • 定时器(Timer)、PerformSelector
      • GCD Async Main Queue
      • 事件响应、手势识别、界面刷新
      • 网络请求
      • AutoreleasePool
    2. RunLoop与线程
    • 每条线程都有唯一的一个与之对应的RunLoop对象
    • RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value
    • 线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建
    • RunLoop会在线程结束时销毁
    • 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop
    3. RunLoop相关类
    RunLoop相关类.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    线程保活实例

    #import "YJThread.h"
    
    
    @interface SubThread : NSThread
    @end
    @implementation SubThread
    - (void)dealloc
    {
        NSLog(@"%s", __func__);
    }
    @end
    
    
    @interface YJThread ()
    
    @property(nonatomic,strong)SubThread *mythread;
    @property(nonatomic,assign)BOOL isStop;
    @property(nonatomic,copy)YJThreadBlock task;
    
    @end
    
    @implementation YJThread
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            
            __weak typeof(self)weakSelf = self;
            
            self.mythread = [[SubThread alloc]initWithBlock:^{
                [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init]  forMode:NSDefaultRunLoopMode];
    
                 NSLog(@"00");
                while (weakSelf&&!weakSelf.isStop) {
                    //获取线程
                    NSLog(@"11");
                    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
                    NSLog(@"22");
    
                }
                
            }];
            [self.mythread start];
        }
        return self;
    }
    
    
    -(void)dotask:(YJThreadBlock)block {
        self.task = block;
        if(_isStop||block==nil)return;
        
        [self performSelector:@selector(doit) onThread:self.mythread withObject:nil waitUntilDone:YES];
    }
    - (void)stop {
        if(!self.mythread)return;
        
        //注意 waitUntilDone:YES  等待线程执行完任务
        [self performSelector:@selector(doStop) onThread:self.mythread withObject:nil waitUntilDone:YES];
    
    }
    
    -(void)doit{
        if(self.task){
            self.task();
        }
    }
    -(void)doStop{
        self.isStop = true;
        CFRunLoopStop(CFRunLoopGetCurrent());
        self.mythread = nil;
    }
    
    -(void)dealloc {
        [self stop];
        NSLog(@"%s 挂了",__func__);
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:iOS-面试题 runloop(夯实基础学习笔记-温故知新3)

          本文链接:https://www.haomeiwen.com/subject/oxawxktx.html