Iphone 如何在Objective-C中使用对象作为键
我想使用自定义对象作为散列结构中的键。我曾尝试使用Iphone 如何在Objective-C中使用对象作为键,iphone,objective-c,ios,Iphone,Objective C,Ios,我想使用自定义对象作为散列结构中的键。我曾尝试使用NS[Mutable]Dictionary,但为了使我的对象成为密钥,它必须实现NSCopying协议NSDictionary正在发送一条copy消息到我所读到的它的所有键。我不想实现协议(我的对象非常复杂),也不想复制它。我有什么选择?我有吗?您需要NSDictionary来保留对象吗?如果没有,您可以将其转换为NSValue,并将其用作键: NSValue *value = [NSValue valueWithNonretainedObjec
NS[Mutable]Dictionary
,但为了使我的对象成为密钥,它必须实现NSCopying
协议NSDictionary
正在发送一条copy
消息到我所读到的它的所有键。我不想实现协议(我的对象非常复杂),也不想复制它。我有什么选择?我有吗?您需要NSDictionary
来保留对象吗?如果没有,您可以将其转换为NSValue
,并将其用作键:
NSValue *value = [NSValue valueWithNonretainedObject:yourCustomObject];
[dictionary setObject:someObject forKey:value];
这可能会有点混乱,但可以替代实施
NSCopying
是否需要NSDictionary
来保留对象?如果没有,您可以将其转换为NSValue
,并将其用作键:
NSValue *value = [NSValue valueWithNonretainedObject:yourCustomObject];
[dictionary setObject:someObject forKey:value];
这可能会有点混乱,但可以替代实现
NSCopying
NSDictionary
与CFDictionaryRef
免费桥接,但它们在添加对象时的行为实际上有所不同。具体来说,NSDictionary
的-setObject:forKey:
将复制该键,但CFDictionaryRef
的CFDictionarySetValue()
不会复制该键。这意味着如果要使用不可复制的键,可以使用CFDictionarySetValue()
将其添加到字典中
CFDictionarySetValue((CFMutableDictionaryRef)myDict, myKey, myValue);
这仍然会保留密钥,但不会复制它。您还可以使用正常的
NSDictionary
方法来处理其他任何事情。NSDictionary
与CFDictionaryRef
进行免费桥接,但它们在添加对象时的行为实际上有所不同。具体来说,NSDictionary
的-setObject:forKey:
将复制该键,但CFDictionaryRef
的CFDictionarySetValue()
不会复制该键。这意味着如果要使用不可复制的键,可以使用CFDictionarySetValue()
将其添加到字典中
CFDictionarySetValue((CFMutableDictionaryRef)myDict, myKey, myValue);
这仍然会保留密钥,但不会复制它。您可以使用普通的
NSDictionary
方法来处理其他任何事情。您可以这样做:
- (id)copyWithZone:(NSZone *)zone {
return [self retain];
}
你可以这样做:
- (id)copyWithZone:(NSZone *)zone {
return [self retain];
}
你可以自己查字典。其实没那么难
另一个选项是使用代理对象,其中包含指向“the”对象的指针。代理将实现散列,并复制或引用要比较的字段以进行isEqual。它可以做一个基本的健全性检查,以确保被引用时比较的字段没有被更改。您可以使用自己的字典。其实没那么难
另一个选项是使用代理对象,其中包含指向“the”对象的指针。代理将实现散列,并复制或引用要比较的字段以进行isEqual。它可以进行基本的健全性检查,以确保在引用时比较的字段未被更改。明显的替代方法是不使用自定义对象作为键。难道没有一些字符串或数字可以用来唯一地标识它吗?我在寻求一种替代方法,允许我使用对象作为键,而不使用无用的副本。显而易见的替代方法是不使用自定义对象作为键。难道没有一些字符串或数字可以用来唯一地标识它吗?我在寻求一种替代方法,允许我将对象用作键,而不使用无用的副本。如果字典是对对象的唯一引用,那么它将消亡。如果字典是对对象的唯一引用,那么它将消亡。除非您的对象是不可变的,这是一个相当糟糕的主意。它只需要对
散列
和isEqual:
消息保持不变。默认情况下,它们只使用对象指针。你是什么意思,只需要是?如果它以任何方式是可变的,那么公开一个跳过实际复制的-copy
方法是一个非常糟糕的主意。这意味着代码看起来像Klass newobj=[obj copy];[newobj mutateSomeProperty]
实际上会修改原始的obj
,这违反了-copy
的所有预期。他说他根本不想实现copy
。因此,他可能会小心地避免使用需要拷贝才能正常工作的API。因此,他可以随心所欲地使用它。实施复制的行为是一种公开声明,上面写着“我支持复制”。试图以一种违背复制工作原理所有预期的方式秘密实现复制是一个非常糟糕的想法,因为不可能永远对该实现保密(yay dynamic runtimes),一旦该实现在类外公开,人们会假设-copy
确实复制了对象。除非您的对象是不可变的,否则这是一个相当糟糕的想法。它只需要对于散列和相等:
消息是不可变的。默认情况下,它们只使用对象指针。你是什么意思,只需要是?如果它以任何方式是可变的,那么公开一个跳过实际复制的-copy
方法是一个非常糟糕的主意。这意味着代码看起来像Klass newobj=[obj copy];[newobj mutateSomeProperty]
实际上会修改原始的obj
,这违反了-copy
的所有预期。他说他根本不想实现copy
。因此,他可能会小心地避免使用需要拷贝才能正常工作的API。因此,他可以随心所欲地使用它。实施复制的行为是一种公开声明,上面写着“我支持复制”。试图以一种违背所有人对复制工作方式的期望的方式秘密地实现复制是一个非常糟糕的想法,因为不可能永远对该实现保密(yay动态运行时),而且一旦它暴露在