有没有“简单”的方法来使用纯粹的objective-c容器,例如NSMutableDictionary或CFMutableDictionary,它们不会增加添加对象的引用计数,而不使用c ++标准库?
编辑:解释 - 我想要的原因是我可以实现一种“Exactly One”模式 - 一个类将有一个静态getThing:(NSString *)名称方法。如果该方法在某些静态数据结构(非引用计数字典)中找到与名称关联的Thing,则返回它,否则创建一个,将其添加到该名称下的结构中,然后返回它。客户端可以随意保留Thing对象,但是当它的引用计数降为0(并且调用dealloc)时,它应该从字典中删除。因此,我在添加时无法释放它,并在删除它时再次保留它 - dealloc会被再次调用,我不希望这样。这就是我需要非递增字典的原因。如果还有另一种方法可以得到我想要的东西,请告诉我,虽然我很确定经过检查的答案能给我我想要的东西。谢谢!
答案 0 :(得分:3)
如果您正在为MacOSX开发,那么您可以使用NSMapTable。请参阅此blog post from Mike Ash以了解详情。
如果您正在为iPhone开发,那么您可以将CFMutableDictionary与自定义回调结构一起使用:
kCFTypeDictionaryKeyCallBacks
和kCFTypeDictionaryValueCallBacks
结构复制到新结构中。retain
和release
字段设置为NULL,您无需保留/释放(键和/或值)。CFDictionaryCreateMutable
时传递结构。这样,您将拥有既不保留也不释放的字典。
答案 1 :(得分:1)
为什么需要非参考计数容器?如果您正在存储普通值(如整数),您可以将它们包装在NSValue类型中,如果您有其他类型,但是您不需要那么多引用计数,只需在它之后立即调用“release”你把它添加到容器中。
答案 2 :(得分:1)
您可以使用NSValue
方法创建代表每个对象的valueWithPointer:
。将值添加到集合中将不会保留引用的对象。这非常严重,因此请考虑是否可能没有更好的方法来实现您的目标,而不是回避所包含对象的容器所有权。
答案 3 :(得分:0)
如果在Mac OS X上,请使用NSMapTable。