美文网首页
处理performSelector编译器警告

处理performSelector编译器警告

作者: HarryStack | 来源:发表于2017-10-30 14:44 被阅读0次

    如果selector是在运行时才确定的,performSelector时,若先把selector保存起来,等到某事件发生后再调用,相当于在动态绑定之上再使用动态绑定,不过这是编译器不知道要执行的selector是什么,因为这必须到了运行时才能欧确定,使用这种特性的代价是,如果在ARC下编译代码,编译器会发生如下的警告: warning:performSelector may cause a leak because its selector is unknown [-Warc-performSelector-leak]

    原因是:编译器不知道执行的selector是什么,因此也就不了解其方法签名及其返回值,甚至连是否有返回值都不清楚,由于编译器不知道方法名,也就没有办法运用ARC的内存管理规则来判定返回值是不是应该释放。所以ARC采用了一种比较谨慎的方法,就是不添加释放操作,然而这么做有可能导致内存泄漏,因为方法在返回对象时可能已经将其保留了。

    如果你确定不会发生内存泄漏的情况下,可以使用如下的语句来忽略掉这条警告:#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

    写了一个方便的宏直接拿来用

    #define kPerformSelectorLeakWarning(Stuff) \
    
    do { \
    
    _Pragma("clang diagnostic push") \
    
    _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
    
    Stuff; \
    
    _Pragma("clang diagnostic pop") \
    
    } while (0)
    

    调用宏

    kPerformSelectorLeakWarning(
        [target performSelector:action withObject:selfwithObject:arr];
    );
    

    相关文章

      网友评论

          本文标题:处理performSelector编译器警告

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