将方法选择器添加到字典中

KON*_*ONG 17 iphone objective-c

我想在字典中添加一个选择器(主要目的是在完成某些操作后识别回调方法和委托)

但我发现我不能这样做,程序会收到错误"EXC_BAD_ACCESS".有没有其他方法可以将该方法选择器添加到字典中?谢谢你的帮助.

小智 36

我知道很久以前这个问题得到了回答,但万一有人会像我一样偶然发现它...

的组合NSStringFromSelectorNSSelectorFromString如上回答可能是最好的一段路要走.但是如果你真的想要,你可以使用选择器作为一个值或键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]];

  • 使用此方法存储密钥的+1比将其转换为字符串更有效,因为指针比较为O(1),而字符串比较为O(n) (3认同)

Ste*_*ton 22

向字典添加新条目会做两件事(除了将其添加到字典中,显然):

  1. 它需要一个键值的副本.这意味着密钥对象必须实现NSCopying协议
  2. retain价值.这意味着它需要实现NSObject协议

这可能是导致你的第二个问题EXC_BAD_ACCESS.

至少有两种解决方法.

首先,您可以将实现选择器的类的实例添加到字典中,而不是添加选择器.通常你的班级将继承NSObject,它将正常工作.请注意,它会保留该类,但可能不是您想要的.

其次,您可以使用NSSelectorFromStringNSStringFromSelector(文档在这里)将选择器转换为字符串(然后再返回).