performSelector не работает при создании селектора из строки

#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 , ,, или,,,.