Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在Objective-C中使用对象作为键_Iphone_Objective C_Ios - Fatal编程技术网

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动态运行时),而且一旦它暴露在