美文网首页
第42条:多用GCD,少用performSelector系列方法

第42条:多用GCD,少用performSelector系列方法

作者: MrSYLong | 来源:发表于2018-10-14 21:56 被阅读12次

    Objective-C本质上是一门非常动态的语言,NSObject定义了几个方法,令开发者可以随意调用任何方法。

    这些方法可以推迟执行方法调用,也可以指定运行方法所用的线程。其中最简单的就是performSelector。

    performSelector系列方法在内存管理方法容易有疏失,它无法确定将要执行的选择器具体是什么,因此,也就不了解起方法签名及返回值,甚至是否有返回值都不清楚,因而ARC编译器也就无法插入适当的内存管理方法。

    performSelector系列方法所能处理的选择器也太过局限,选择器返回值只能是void或对象类型,参数类型必须是对象类型,最多只能传两个参数,参数不止两个情况就没有对应的performSelector方法可以使用了。

    如果想把任务放在另一个线程上执行,那么最后不要用performSelector系列方法,而是应该把任务封装到块里,然后调用GCD相关方法来实现。

    // 延迟执行方法
    // 使用performSelector
    [self performSelector:@selector(doSomething) withObject:nil afterDelay:5.0];
    
    // 使用GCD
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
    dispatch_after(time, dispatch_get_main_queue(), ^(void){
        [self doSomething];
    });
    
    // 在主线程中执行方法
    // 使用performSelector
    [self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:NO];
    
    // 使用GCD 如果waitUntilDone为YES,则用dispatch_sync
    dispatch_async(dispatch_get_main_queue(),^{
        [self doSomething];
    });
    

    相关文章

      网友评论

          本文标题:第42条:多用GCD,少用performSelector系列方法

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