KON*_*ONG 17 iphone objective-c
我想在字典中添加一个选择器(主要目的是在完成某些操作后识别回调方法和委托)
但我发现我不能这样做,程序会收到错误"EXC_BAD_ACCESS".有没有其他方法可以将该方法选择器添加到字典中?谢谢你的帮助.
小智 36
我知道很久以前这个问题得到了回答,但万一有人会像我一样偶然发现它...
的组合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]];
Ste*_*ton 22
向字典添加新条目会做两件事(除了将其添加到字典中,显然):
NSCopying协议retain价值.这意味着它需要实现NSObject协议这可能是导致你的第二个问题EXC_BAD_ACCESS.
至少有两种解决方法.
首先,您可以将实现选择器的类的实例添加到字典中,而不是添加选择器.通常你的班级将继承NSObject,它将正常工作.请注意,它会保留该类,但可能不是您想要的.
其次,您可以使用NSSelectorFromString和NSStringFromSelector(文档在这里)将选择器转换为字符串(然后再返回).
| 归档时间: |
|
| 查看次数: |
7123 次 |
| 最近记录: |