1

Ниже представлен простой PerformSelector, который отправляет сообщение obj для выполнения метода циклирования. Все работает хорошо, но я получаю следующее желтое предупреждение.Почему предупреждение с моим исполнениемВыбор

PerformSelector может вызвать утечку, поскольку его селектор неизвестен.

#import "MyClass.h" 
#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     MyClass *obj = [[MyClass alloc]init]; 

     SEL mySel = @selector(looping); 
     [obj performSelector:mySel]; 
    } 
    return 0; 
} 

Это предупреждение не имеет смысла, потому что performSelector должна быть осведомлена о mySel, так как методы перекручивания делают дозвонились - любые идеи, что происходят ??


Обновление

MyClass.h

#import <Foundation/Foundation.h> 

@interface MyClass : NSObject 

-(void)looping; 

@end 

MyClass.m

#import "MyClass.h" 

@implementation MyClass 

-(void)looping{ 

    NSLog(@"Hey, i'm looping"); 

} 

@end 

ответ

2

Update - Реальный ответ

Это ARC конкретны:

performSelector may cause a leak because its selector is unknown

Короче говоря, ARC использует информацию, основанную на соглашениях об именах и каких-либо дополнительных атрибутов, связанных с селектором. При доступе к селектору по имени и выполнению его с помощью семейства методов performSelector: эта информация теряется, и компилятор предупреждает вас о том, что он должен делать некоторые предположения относительно подсчета ссылок, поскольку эта информация удаляется.

Короче говоря, конкретная программа, которую вы отправили, является безопасным , но вам предлагается использовать альтернативу, удобную для ARC.

предыдущего ответа

декларация селектора не должен быть виден текущего перевода, чтобы вызвать его.

Компилятор может принимать типы по умолчанию для параметров и типов возвращаемых данных для методов класса и экземпляра (по умолчанию используется id).

Существует несколько предупреждений компилятора, которые могут предупредить вас об этих теневых действиях.

Возможно, вы забыли объявить селектор looping в @interface, или вы можете опустить двоеточие, если оно имеет аргументы: looping: будет его именем.

+0

Спасибо вам за помощь, но как NEWB Im все еще немного запутался. Если бы вы могли объяснить или даже лучше отправить пример того, что вы имеете в виду, не объявляя текущий перевод.Метод looping находится в интерфейсе и не требует двоеточия, потому что он не принимает никаких аргументов (он просто выводит строку). – pete

+0

@pete благодарит за расширение вашего сообщения. Я обновил его с реальным ответом. – justin

+0

, что объясняет это, и да, у меня включен ARC. Спасибо – pete

0

это предупреждение из-за что и не сказали компилятору, где селектор проживает, импортировать файл, где он является или добавить селектор в заголовок файла, где он должен быть

+0

Селектор - это метод класса из MyClass. Я разместил #import «MyClass.h» в верхней части main - – pete

+0

ли вы объявили, что в ur MyClass.h? – Saad

+0

компилятор знает только то, что предопределено в строке или включено через некоторую библиотеку. – Saad