PerformSelector警告

时间:2012-01-07 21:21:38

标签: ios objective-c compiler-warnings performselector

我收到了警告

  

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> {

//
}

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

您也可以使用objc_msgSend而不是performSelector,如here所述。

答案 3 :(得分:3)

您可以在WARNING_CFLAGS中为Build Settings添加 -Wno-arc-performSelector-leaks enter image description here

Found the solution here

答案 4 :(得分:0)

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

#pragma GCC diagnostic ignored "-Wundeclared-selector"
相关问题