• 【runloop】performSelector方法探究


    NSObject类提供了很多方法供我们使用,这些方法是添加到runloop的,所以如果没有开启runloop的话,不会运行(不过有个坑,请看下面介绍)。

    1. /// 主线程
    2. performSelectorOnMainThread:withObject:waitUntilDone:
    3. performSelectorOnMainThread:withObject:waitUntilDone:modes:
    4. /// 指定线程
    5. performSelector:onThread:withObject:waitUntilDone:
    6. performSelector:onThread:withObject:waitUntilDone:modes:
    7. /// 针对当前线程
    8. performSelector:withObject:afterDelay:
    9. performSelector:withObject:afterDelay:inModes:
    10. /// 取消,在当前线程,和上面两个方法对应
    11. cancelPreviousPerformRequestsWithTarget:
    12. cancelPreviousPerformRequestsWithTarget:selector:object:

    下面提供的方法是在指定的线程运行aSelector,一般情况下aSelector会添加到指定线程的runloop。但,如果调用线程和指定线程为同一线程,且wait参数设为YES,那么aSelector会直接在指定线程运行,不再添加到runloop。

    1. performSelectorOnMainThread:withObject:waitUntilDone:
    2. performSelectorOnMainThread:withObject:waitUntilDone:modes:
    3. performSelector:onThread:withObject:waitUntilDone:
    4. performSelector:onThread:withObject:waitUntilDone:modes:

    其实这也很好理解,假设这种情况也添加到指定线程的runloop,我们可以这样反向理解:

    1、当前线程runloop还没有开启,那么aSelector就不会被执行,然而你却一直在等待,造成线程卡死。

    2、当前线程runloop已经开启,那么调用performSelector这个方法的位置肯定是处于runloop的callout方法里面,在这里等待runloop再callout从而调用aSelector方法完成,显然也是死等待,线程卡死。。。

    还有一些performSelector方法,是不会添加到runloop的,而是直接执行,可以按照上面的特殊情况进行理解。方法列举如下:

    1. - (id)performSelector:(SEL)aSelector;
    2. - (id)performSelector:(SEL)aSelector withObject:(id)object;
    3. - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

    看到这里,是否感觉有些乱???只要记住没有延迟或者等待的都不会添加到runloop,有延迟或者等待的还有排除上面提到的特殊情况。

  • 相关阅读:
    重庆自考本科难考吗?怎样降低难度?
    你所不知道的WMS
    xss漏洞和分析
    java使用sigar获取服务器的信息
    Notepad++正则查询替换操作
    神经网络 torch.nn---nn.LSTM()
    机器学习---预剪枝、后剪枝(REP、CCP、PEP、)
    数据治理体系演进简介
    目标检测——day44 Tiny Object Detection in Aerial Images
    AT800(3000) +昇腾300V 之 第一个例子图片分类
  • 原文地址:https://blog.csdn.net/allanGold/article/details/126370816