Единственное отличие - это подпись метода, который вы собираетесь вызывать из @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!");
}