Сигнатура вашего метода:
- (void) myTest:(NSString *)
withAString является параметром (имя вводит в заблуждение, похоже, что это часть сигнатуры селектора).
Если вы вызываете функцию таким образом:
[self performSelector:@selector(myTest:) withObject:myString];
Это будет работать.
Но, как предлагали другие плакаты, вы можете переименовать метод:
- (void)myTestWithAString:(NSString*)aString;
И позвонить:
[self performSelector:@selector(myTestWithAString:) withObject:myString];
В Objective-C сигнатура селектора состоит из:
Селекторы не знают:
Вот реализация класса, в которой метод performMethodsViaSelectors выполняет другие методы класса посредством селекторов:
@implementation ClassForSelectors
- (void) fooNoInputs {
NSLog(@"Does nothing");
}
- (void) fooOneIput:(NSString*) first {
NSLog(@"Logs %@", first);
}
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
NSLog(@"Logs %@ then %@", first, second);
}
- (void) performMethodsViaSelectors {
[self performSelector:@selector(fooNoInputs)];
[self performSelector:@selector(fooOneInput:) withObject:@"first"];
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"];
}
@end
Метод, для которого вы хотите создать селектор, имеет единственный вход, поэтому вы должны создать селектор для него следующим образом:
SEL myTestSelector = @selector(myTest:);
Ваша подпись метода не имеет смысла, вы уверены, что это не опечатка? Я не понимаю, как он вообще компилируется, хотя, возможно, вы получаете предупреждения, которые игнорируете?
Сколько параметров вы ожидаете от этого метода?
Считаете, что класс должен быть определен как:
- (void) myTestWithSomeString:(NSString *) astring{
NSLog(@"hi, %s", astring);
}
У вас есть только один параметр, поэтому вы должны иметь только один:
Вы также можете рассмотреть возможность использования% @ в вашем NSLog - это просто хорошая привычка - затем вы будете записывать любой объект, а не только строки.
У вашего кода две проблемы. Один был идентифицирован и ответил, а другой нет. Во-первых, в вашем селекторе отсутствовало имя параметра. Однако даже когда вы это исправите, строка все равно вызовет исключение, если ваша измененная подпись метода все еще включает более одного аргумента. Допустим, ваш измененный метод объявлен как:
-(void)myTestWithString:(NSString *)sourceString comparedTo:(NSString *)testString ;
Создание селекторов для методов, которые принимают несколько аргументов, совершенно допустимо (например, @selector (myTestWithString: compareTo :)). Однако метод performSelector позволяет передавать в myTest только одно значение, которое, к сожалению, имеет более одного параметра. Он выдаст ошибку и сообщит вам, что вы не предоставили достаточно значений.
Вы всегда можете переопределить свой метод, чтобы принимать коллекцию как единственный параметр:
-(void)myTestWithObjects:(NSDictionary *)testObjects ;
Однако, есть более элегантное решение (не требующее рефакторинга). Ответ - использовать NSInvocation вместе с его setArgument: atIndex:
и вызывать методы
.
Я написал статью, включая пример кода ], если вам нужны подробности. Основное внимание уделяется многопоточности, но основы все еще применимы.
Удачи!