9

我收到警告

PerformSelector 可能会导致泄漏,因为它的选择器是未知的

在代码中:

- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
    assert([NSThread isMainThread]);
    if([delegate respondsToSelector: selector])
    {
        if(arg != NULL)
        {
            //this line the warning
            [delegate performSelector: selector 
                           withObject: arg 
                           withObject: err]; 
        }
        else
        {
            //this line the warning
            [delegate performSelector: selector 
                           withObject: err]; 
        }
    }
    else
    {
        NSLog(@"Missed Method");
    }
}

标题:

@interface Topscore : UIViewController <NSObject> {

//
}
4

5 回答 5

43

if ... respondsToSelector: selector不会工作,因为你selector只是方法的名称。对于您的情况,您需要检查

if ([delegate respondsToSelector: @selector(method::)]

而对于另一种情况,只是method:.

无论如何,您可以像这样抑制警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self performSelector:nextView];
#pragma clang diagnostic pop
于 2012-01-07T23:18:15.597 回答
4

这是编译器生成的警告,因为在编译和启用自动引用计数 (ARC) 时使用了 -Wundeclared-selector。通常,这可以安全地忽略,因为很明显名为“selector”的变量中的选择器在编译时是未知的,因为它将在运行时分配其值。

于 2012-01-07T21:44:18.920 回答
3

您还可以使用 objc_msgSend 代替 performSelector,如此处所述

于 2012-02-08T22:30:39.780 回答
3

您 可以在. _WARNING_CFLAGSBuild Settings在此处输入图像描述

在这里找到了解决方案

于 2014-10-20T10:44:29.327 回答
0

最简单的方法是将此宏添加到您的 pch 文件中。或 .m 文件..

#pragma GCC diagnostic ignored "-Wundeclared-selector"
于 2015-06-09T04:05:55.597 回答