Добавить селектор методов в словарь
Я хочу добавить селектор в словарь (основная цель - идентифицировать метод обратного вызова и делегировать его после завершения чего-либо)
Но я нахожу, что не могу этого сделать, программа получит сообщение об ошибке "EXC_BAD_ACCESS".
Есть ли другой способ добавить этот селектор методов в словарь?
Благодарим за помощь.
Ответы
Ответ 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.