PerformSelector警告

Bla*_*zer 10 objective-c compiler-warnings ios 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

标题:

@interface Topscore : UIViewController <NSObject> {

//
}
Run Code Online (Sandbox Code Playgroud)

ott*_*t-- 43

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

if ([delegate respondsToSelector: @selector(method::)]
Run Code Online (Sandbox Code Playgroud)

而另一种情况只是为了method:.

无论如何,你可以像这样压制警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self performSelector:nextView];
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

  • 我发现在类实现开始时使用`#pragma clang diagnostic ignored"-Warc-performSelector-leaks"就足够了. (5认同)
  • @Julian然后你不知道你的类实现中的其他地方是否存在真正的问题.另一方面,如果您不介意,可以在构建设置中全局禁用警告... (2认同)

小智 4

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