Iphone 如何存储对象+;不保留对象的字符串对,以及使用何种存储?

Iphone 如何存储对象+;不保留对象的字符串对,以及使用何种存储?,iphone,cocoa-touch,uikit,Iphone,Cocoa Touch,Uikit,我正在实现一个类,该类必须将任意对象与字符串一起存储。i、 e myUIViewObject, @"that's a nice view" myUIViewController, @"not really special" myOtherObject, @"very important one" 这个列表可以随时扩展和修改,所以我考虑在这里使用NSMutableDictionary。但我不是很确定 对象应该是键,也就是说,当我这样要求myUIViewController或myOtherObje

我正在实现一个类,该类必须将任意对象与字符串一起存储。i、 e

myUIViewObject, @"that's a nice view"
myUIViewController, @"not really special"
myOtherObject, @"very important one"
这个列表可以随时扩展和修改,所以我考虑在这里使用NSMutableDictionary。但我不是很确定

对象应该是键,也就是说,当我这样要求myUIViewController或myOtherObject时,我希望很容易找到匹配的字符串:

- (NSString*)checkObjNoteStringForObject:(id)anyObjectInList;
另一个问题是,当一个对象被添加到该“列表”中时,我不希望因此而保留它。NSMutableDictionary保留了它的内容,对吗?我是否可以在事后发送一个-release来撤销这种不必要的行为,并且在从列表中删除时,在执行此操作之前发送-retain?还是有更优雅的方式


你有什么建议?谢谢大家

如果您的字典键未保留,一旦取消分配,对字典的访问将导致未定义的行为(实际上,如果查找碰巧命中该字典元素,它们将崩溃)。要想做你想做的事情,你需要一种策略,在必要时从字典中删除对象


如果您确实有一个,例如,覆盖对象'
-dealloc
,并从中删除它们,您可以使用
+[NSValue-valueWithNonretainedObject:]
执行您想要的操作。
NSValue
将引用您的对象而不保留它,字典将复制
NSValue
(键被复制,而不是保留)。只要记住每次你想在字典中查找某个东西时都要创建一个
NSValue
;辅助函数或方法是一个好主意。

当复制键(在本例中为NSValue)时:这是否意味着NSValue引用的对象也不会被复制?如果对象被复制,这将是不好的,因为其中一些对象可能有较大的内存占用。否。NSValue只是一个附加了类型信息的“比特包”,因此真正的副本只会复制指向对象的指针。由于NSValue是不可变的,所以它的-copy实现将只调用-retain。但是,如果您使用自己的对象作为键,那么这种区别将非常重要;他们需要执行NSCopying协议。