Подтвердить что ты не робот

Добавить селектор методов в словарь

Я хочу добавить селектор в словарь (основная цель - идентифицировать метод обратного вызова и делегировать его после завершения чего-либо)

Но я нахожу, что не могу этого сделать, программа получит сообщение об ошибке "EXC_BAD_ACCESS". Есть ли другой способ добавить этот селектор методов в словарь? Благодарим за помощь.

4b9b3361

Ответ 1

Добавление новой записи в словарь делает две вещи (в дополнение к добавлению их в словарь, очевидно):

  • Требуется копия значения ключа. Это означает, что ключевой объект должен реализовать протокол NSCopying
  • retain значение. Это означает, что ему необходимо реализовать протокол NSObject

Вероятно, это второе, вызвавшее ваш EXC_BAD_ACCESS.

Существует по крайней мере два пути.

Во-первых, вместо добавления селектора вы можете добавить экземпляр класса, который реализует селектор в ваш словарь. Обычно ваш класс наследует от NSObject, и он будет работать нормально. Обратите внимание, что он сохранит класс, хотя, возможно, не то, что вы хотите.

Во-вторых, вы можете преобразовать селектор в строку (и обратно) с помощью NSSelectorFromString и NSStringFromSelector (docs здесь).

Ответ 2

Я знаю, что на этот вопрос был дан ответ давным-давно, но на всякий случай он натыкается на него, как будто я...

Комбинация NSStringFromSelector и NSSelectorFromString, как было сказано выше, вероятно, является лучшим способом. Но если вы действительно этого хотите, вы можете использовать селектор как значение или ключ в NSDictionary.

Селектор (тип SEL) реализуется как указатель на структуру во время автономной работы Apple Objective-C. Указатель не может быть использован непосредственно в словаре, но указатель может быть обернут в объект NSValue, который можно использовать.

С помощью этого метода вы можете сохранить селектор в качестве значения в словаре, используя следующий код:

dictionary = 
  [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:selector]
                              forKey:key];

Селектор можно получить с помощью следующего кода:

SEL selector = [[dictionary objectForKey:key] pointerValue];

Аналогично для использования селектора в качестве ключа:

dictionary = 
  [NSDictionary dictionaryWithObject:value
                              forKey:[NSValue valueWithPointer:selector]];

value = [dictionary objectForKey:[NSValue valueWithPointer:selector]];

Ответ 3

Я получаю свой ответ на основе комментария Zydeco:

Вы можете конвертировать между SEL и NSString с использованием NSSelectorFromString и NSStringFromSelector

Ответ 4

Общая идиома в Obj-C состоит в том, чтобы иметь конкретные имена для обратных вызовов для определенных событий. (Такой parserDidBeginDocument: из NSXMLParserDelegate). Если вам действительно нужно указать имена, скорее всего, ваш единственный ресурс должен добавить имена селекторов как @"mySelector:withArgument:context:" или somesuch.