将选择器存储为NSDictionary中的值

syn*_*nic 52 cocoa cocoa-touch nsdictionary selector

有没有办法将选择器存储在一个NSDictionary,而不是存储为NSString

Geo*_*che 104

SEL只是一个指针,你可以存储在NSValue:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
                       [NSValue valueWithPointer:@selector(foo)], @"foo",
                       nil];
Run Code Online (Sandbox Code Playgroud)

要重新选择选择器,您可以使用:

SEL aSel = [[dict objectForKey:@"foo"] pointerValue];
Run Code Online (Sandbox Code Playgroud)

  • 也许还要提到要恢复SEL,你必须这样做:`SEL*aSel = [[dict objectForKey:@"foo"] pointerValue];` (6认同)

Dav*_*d H 10

Georg的解决方案的替代方案是在将选择器存储为NSDictionary之前将其转换为NSString:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
                      NSStringFromSelector(@selector(foo)), @"foo",
                      nil];

SEL selector = NSSelectorFromString([dict objectForKey:@"foo"]);
Run Code Online (Sandbox Code Playgroud)

这种技术虽然使用了更多的内存,但是您可以通过JSONKit等库将整个NSDictionary序列化为字符串.


dra*_*ard 6

一个NSDictionary是真的只是一个CFDictionary保留和释放所有键和值.如果CFDictionary直接创建,则可以将其设置为不保留和释放值.您可以将a转换为a CFDictionaryRef,NSDictionary *反之亦然.