【问题标题】:PerformSelector warning执行选择器警告
【发布时间】:2012-01-07 21:21:37
【问题描述】:

我收到警告

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

//
}

【问题讨论】:

标签: ios objective-c compiler-warnings performselector


【解决方案1】:

您的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

【讨论】:

  • 选择性地忽略警告非常方便。谢谢。
  • 我发现在类实现的开头使用#pragma clang diagnostic ignored "-Warc-performSelector-leaks"就足够了。
  • @Julian 但是你不知道你的类实现中是否存在真正的问题。另一方面,如果您不介意,您可以在构建设置中全局禁用警告...
【解决方案2】:

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

【讨论】:

  • 谢谢,但在我的应用程序中它返回了 NSLOG;错过的方法。这是错误的
  • 这意味着对象没有实现该方法(因此不响应指定的选择器)。它不会导致内存泄漏,因为如果到达 if 结构的“else”分支,则尚未调用 -[delegeta performSelector] 方法,因此它无法保留对象,因此没有内存泄漏。
  • 您还记得在每个参数的选择器后面加一个冒号吗? -(void)methodWithObject:(id)arg1; 的选择器实际上是 @selector(methodWithObject:)。冒号是其中的一部分。
  • "这通常可以安全地忽略..." 除非选择器恰好以 newallocretaincopymutableCopy 开头/跨度>
【解决方案3】:

您也可以使用 objc_msgSend 代替 performSelector,如 here 所述。

【讨论】:

  • 为什么要矫枉过正?这只是做同样事情的另一种方式,不是吗?
【解决方案4】:

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

Found the solution here

【讨论】:

    【解决方案5】:

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

    #pragma GCC diagnostic ignored "-Wundeclared-selector"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多