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)
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序列化为字符串.
一个NSDictionary是真的只是一个CFDictionary保留和释放所有键和值.如果CFDictionary直接创建,则可以将其设置为不保留和释放值.您可以将a转换为a CFDictionaryRef,NSDictionary *反之亦然.