Cocoa的NSDictionary:为什么复制密钥?

Cocoa的NSDictionary:为什么复制密钥?,第1张

概述用作NS(Mutable)字典中的键的所有对象都必须支持NSCopying协议,并且这些对象在字典中使用时被复制。 我经常想使用较重的物体作为键,只需将一个物体映射到另一个物体。当我这样做时,我真正的意思是: [dictionary setObject:someObject forKey:[NSValue valueWithPointer:keyObject]]; (“当我回来,再次给你这个相同的 @H_419_6@ 用作NS(Mutable)字典中的键的所有对象都必须支持NScopying协议,并且这些对象在字典中使用时被复制。

我经常想使用较重的物体作为键,只需将一个物体映射到另一个物体。当我这样做时,我真正的意思是:

[dictionary setobject:someObject forKey:[NSValue valueWithPointer:keyObject]];

(“当我回来,再次给你这个相同的关键对象实例,让我相同的价值。”)

…这正是我最终做的,有时会绕过这个设计。 (是的,我知道桌面Cocoa中的NSMaptable;但是iPhone不支持这一点。)

但是我真的不知道为什么复制密钥是必要的或首选的。它购买的是执行还是来电?

解决方法 复制确保用作键的值在用作键时不会更改“underhand”。考虑一个可变字符串的例子:

NSMutableString* key = ... NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];[dict setobject: ... forKey: key];

我们假设字典没有复制密钥,而是保留它。如果现在,在稍后的一点,原始字符串被修改,那么很可能你不会再次在字典中找到你的存储值,即使你使用相同的键对象(即,以上示例中的要点)。

为了保护自己免受这样的错误,字典复制所有的键。

注意,btw,它很简单地定义-copyWithZone:只是做return [self retain]。这是允许的和良好的代码,如果你的对象是不可变的,NScopying的合同是专门设计的,所返回的对象必须是(sorta,kinda)不可变的:

Implement NScopying by retaining the original instead of creating a new copy when the class and its contents are immutable.

The copy returned is immutable if the consIDeration “immutable vs. mutable” applIEs to the receiving object; otherwise the exact nature of the copy is determined by the class.

(均为NSCopying Reference)

即使您的对象不是不可变的,如果您只使用基于身份的等同/哈希实现,即实现,也不会受到对象内部状态的任何影响,您可能会忽略该实现。

总结

以上是内存溢出为你收集整理的Cocoa的NSDictionary:为什么复制密钥?全部内容,希望文章能够帮你解决Cocoa的NSDictionary:为什么复制密钥?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1039236.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存