Iphone 如何获取协议对象的唯一标识符

Iphone 如何获取协议对象的唯一标识符,iphone,objective-c,cocoa,Iphone,Objective C,Cocoa,我正在尝试使用字典存储与协议相对应的代理映射。我需要一些表示协议的一致密钥 例如,下面给出了一个协议对象 Protocol * one = @protocol(SomeProtocolDefinedEarlier); 它响应[one hash],但每次为同一协议获取协议对象时,哈希值都不相同。是否有一些名称消息或我可以用来识别它的东西?好吧,协议必须有唯一的名称(否则它们会相互冲突),那么: Protocol * aProtocol = ... NSString * protocolIdent

我正在尝试使用字典存储与协议相对应的代理映射。我需要一些表示协议的一致密钥

例如,下面给出了一个协议对象

Protocol * one = @protocol(SomeProtocolDefinedEarlier);

它响应
[one hash]
,但每次为同一协议获取协议对象时,哈希值都不相同。是否有一些
名称
消息或我可以用来识别它的东西?

好吧,协议必须有唯一的名称(否则它们会相互冲突),那么:

Protocol * aProtocol = ...
NSString * protocolIdentifier = NSStringFromProtocol(aProtocol);

哇,看起来
name
实际上返回了一致的东西。是c字串吗?为什么我找不到协议对象上的文档?Objective-C运行时源代码可用,您可以查找
协议*
的定义。最好根据Dave DeLong的答案使用基础函数(例如NStrugFunFrand协议)。在文档中人们是如何找到这种东西的?当我有你在这里时,为某个随机对象(例如)获取密钥的最佳方法是什么?我可以请求[obj hash]并将其转换为字符串,但我认为我读到这是一个坏主意。肖恩:它们在基础函数引用中:对于唯一地标识实例,可以使用对象的散列或地址。@肖恩- ObjuleC规范说明每个对象实例都是由其引用唯一标识的(类型<代码> ID <代码>)。在当前的实现中,
id
是指向结构的指针,因此内存地址是实例id。您可以使用由实例直接键入的
NSDictionary
NSHashMap
。@Barry-除非对象符合NSCopying,即复制它们而不是使用散列,否则不起作用。根本不是我想要的。NSHashMap在iphone上不可用。我通过为字典创建一个类别来解决这个问题,该类别添加了一些“弱键”函数。