#ios #performselector
#iOS #performselector
Вопрос:
Я создаю селектор из строки:
NSString *seleccion = [NSString new];
seleccion = (NSString*)[self.detailItem description];
SEL methodToSelect = NSSelectorFromString(seleccion);
if ([self respondsToSelector:methodToSelect])
{
NSLog(@"the method exist");
[self performSelector:methodToSelect withObject:nil afterDelay:0.0];
}
Но метод никогда не выполняется.
Я пробовал, это:
[self performSelector:@selector(myMethod)];
и это работает просто отлично.
Я использую :
[self performSelector:methodToSelect withObject:nil afterDelay:0.0];
потому что, если я использую
[self performSelector:methodToSelect];
Я получаю это предупреждение «PerfomSelector может вызвать утечку, поскольку его селектор неизвестен»
Я буду очень признателен за вашу помощь или любые указания о том, как заставить это работать.
Комментарии:
1. У меня ваш код работает нормально. Вы уверены, что [self.detailItem description] возвращает строку с именем реализованного вами метода? Регистрируется ли «метод exist» на консоли? Кстати, ваша первая строка, NSString *seleccion = [NSString new];, не нужна, поскольку вы присваиваете seleccion чему-то другому в следующей строке.
2. Причина, по которой у меня есть это «if ([self RESPONSESTOSELECTOR:methodToSelect])», заключается в проверке существования селектора.
3. Я не знаю, что вам тогда сказать, потому что у меня это сработало нормально. Не зная, что вернул [self.detailItem description] и что вы сделали при реализации метода, на который указывает этот селектор, я не могу предложить никакой помощи. Какова природа detailItem? Это строка?
Ответ №1:
performSelector:withObject:afterDelay:
не запускает метод немедленно. Он запускает его асинхронно в цикле выполнения текущего потока. Если этого нет в основном потоке, то цикл выполнения не выполняется, если вы явно не запустили его. Кроме того, если ваше приложение не основано на цикле выполнения, у него также не будет цикла выполнения.
Комментарии:
1. Я использовал [self performSelector: methodToSelect]; но я получал это предупреждение: «Я получаю это предупреждение «PerfomSelector может вызвать утечку, потому что его селектор неизвестен». Знаете ли вы, как это обойти?
2. @user2924482: просто подавите предупреждение, если вы знаете, что это не селектор, который начинается с
new
,alloc
retain
,copy
mutableCopy
, ,, или,,,.