Objective-c executeSelector: vs executeSelector: withObject - PullRequest
2 голосов
/ 15 декабря 2011

Звонит [myObject performSelector:@selector(something) withObject:nil]; так же, как просто звонит [myObject performSelector:@selector(something)];?

1 Ответ

5 голосов
/ 15 декабря 2011

Единственное отличие - это подпись метода, который вы собираетесь вызывать из @selector.Используйте performSelector, когда метод не принимает аргументов, и используйте performSelector:withObject, если метод принимает один аргумент типа id.В противном случае они оба делают одно и то же.

Из ссылки на протокол NSObject :

Обсуждение

Этот метод такой же, как executeSelector: за исключением того, что вы можете указать аргумент дляaSelector.aSelector должен идентифицировать метод, который принимает один аргумент типа id.Для методов с другими типами аргументов и возвращаемыми значениями используйте NSInvocation.

Как указывает Чак, это на самом деле не применяется (по крайней мере, на данный момент).Приведенный ниже код выполняется без каких-либо исключений.

-(void)viewDidLoad
{
    [super viewDidLoad];    
    [self performSelector:@selector(foo) withObject:nil];
}
-(void)foo
{
    NSLog(@"foo!");
}

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

-(void)viewDidLoad
{
    [super viewDidLoad];    
    [self performSelector:@selector(foo)];
}
-(void)foo:(id)myParameter
{
    NSLog(@"foo!");
}
...