·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> PerformSelectormaycausealeakbecauseitsselectorisunknown解决方法

PerformSelectormaycausealeakbecauseitsselectorisunknown解决方法

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

我的技术博客经常被流氓网站恶意爬取转载。请移步原文:http://www.cnblogs.com/hamhog/p/3801030.html,享受整齐的排版、有效的链接、正确的代码缩进、更好的阅读体验。

在Objective-C中需要以函数名或者函数指针来调用函数时,以回调函数为例,对象为(id)target,它的成员函数名为callback,之前习惯是这么写的:

if ([target respondsToSelector:callback]){
    [target performSelector:callback withObject:nil];
}

但是在ARC下会报一个warning: PerformSelector may cause a leak because its selector is unknown

在网上查,很多人说的方法都是定义宏去ignore warning之类的。总感觉很不爽。今天查到了正确的解决方法:

【解决方法】

if ([target respondsToSelector:callback]){
//    [target performSelector:callback withObject:nil];
    IMP imp = [target methodForSelector:callback];
    void (*func)(id, SEL) = (void *)imp;
    func(target, callback);
}

这样就不会报warning了。

【原因】

详细解释可见爆栈上这个被采纳的答案。

暂时没时间翻译了,就先贴个链接在这儿吧~