首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PerformSelector警告

PerformSelector警告
EN

Stack Overflow用户
提问于 2012-01-07 21:21:37
回答 5查看 13.9K关注 0票数 9

我收到警告

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

代码中的

代码语言:javascript
复制
- (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");
    }
}

头:

代码语言:javascript
复制
@interface Topscore : UIViewController <NSObject> {

//
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-07 21:44:18

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

票数 4
EN

Stack Overflow用户

发布于 2012-01-07 23:18:15

您的if ... respondsToSelector: selector无法工作,因为您的selector只是该方法的名称。对于你的案子,你需要检查

代码语言:javascript
复制
if ([delegate respondsToSelector: @selector(method::)]

而对于另一个案例,仅针对method:

总之,你可以压制这样的警告:

代码语言:javascript
复制
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self performSelector:nextView];
#pragma clang diagnostic pop
票数 43
EN

Stack Overflow用户

发布于 2012-02-08 22:30:39

您还可以使用objc_msgSend而不是performSelector,正如所描述的here

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8773226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档