处理performSelector编译器警告

如果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];
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 1,989评论 1 16
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,027评论 0 12
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,002评论 0 7
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,409评论 0 35
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,203评论 30 471