Предупреждение PerformSelector - PullRequest
       11

Предупреждение PerformSelector

10 голосов
/ 08 января 2012

Я получаю предупреждение

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 ]

43 голосов
/ 08 января 2012

Ваш 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
4 голосов
/ 08 января 2012

Это предупреждение, сгенерированное компилятором, поскольку -Wundeclared-selector использовался при компиляции и включенном автоматическом подсчете ссылок (ARC). В целом это можно безопасно игнорировать, поскольку очевидно, что селектор в переменной с именем «селектор» неизвестен во время компиляции, так как ему будет присвоено значение во время выполнения.

3 голосов
/ 20 октября 2014

Вы можете добавить -Wno-arc-executeSelector-leaks для WARNING_CFLAGS в Build Settings. enter image description here

Нашел решение здесь

3 голосов
/ 09 февраля 2012

Вы также можете использовать objc_msgSend вместо executeSelector, как описано здесь .

0 голосов
/ 09 июня 2015

Самый простой способ - добавить этот макрос в ваш файл pch. Или .m файл ..

#pragma GCC diagnostic ignored "-Wundeclared-selector"
...