Хотя ответ Георга должен работать, NSValue
также поддерживает кодирование любого значения с использованием строки кодирования типа Objective-C, которая имеет специальный способ представления SEL
- с помощью ":"
(в отличие от "^v"
, созданного -valueWithPointer:
, что переводится как void *
) .
source: Руководство по программированию Objective-C Runtime - Типовые кодировки
Отработка решения Georg, лучший API-совместимый способ поместить SEL
в NSValue
в NSDictionary
, будет:
// store
NSDictionary *dict = @{
@"foo": [NSValue value:&@selector(foo) withObjCType:@encode(SEL)]
};
// retrieve
SEL aSel;
[dict[@"foo"] getValue:&aSel];
Обоснование для обработки SEL
как своего собственного зверя заключается в том, что документы описывают его как «непрозрачный тип», что означает, что его внутренняя работа (даже то, что typedef
d)закрыты для программистов приложений;Apple может перепутать это в любое время в будущем.
Кроме того, использование void *
s, чтобы заставить систему делать то, что вы хотите, было полезно в C еще в 90-х, когда большинствомы не знали лучше. Теперь вы лучше этого.
Вышеупомянутый подход следует использовать только в том случае, если получение SEL
происходит во время работы программы - вы не должны хранить это NSDictionary
на диск.Если вам необходимо хранить SEL
s в долгосрочной перспективе (при каждом запуске приложения), вы должны следовать подходу Дэвида Х и преобразовать его в NSString
.