objective-c中的非引用计数字典

时间:2010-06-15 03:33:49

标签: objective-c

有没有“简单”的方法来使用纯粹的objective-c容器,例如NSMutableDictionary或CFMutableDictionary,它们不会增加添加对象的引用计数,而不使用c ++标准库?

编辑:解释 - 我想要的原因是我可以实现一种“Exactly One”模式 - 一个类将有一个静态getThing:(NSString *)名称方法。如果该方法在某些静态数据结构(非引用计数字典)中找到与名称关联的Thing,则返回它,否则创建一个,将其添加到该名称下的结构中,然后返回它。客户端可以随意保留Thing对象,但是当它的引用计数降为0(并且调用dealloc)时,它应该从字典中删除。因此,我在添加时无法释放它,并在删除它时再次保留它 - dealloc会被再次调用,我不希望这样。这就是我需要非递增字典的原因。如果还有另一种方法可以得到我想要的东西,请告诉我,虽然我很确定经过检查的答案能给我我想要的东西。谢谢!

4 个答案:

答案 0 :(得分:3)

如果您正在为MacOSX开发,那么您可以使用NSMapTable。请参阅此blog post from Mike Ash以了解详情。

如果您正在为iPhone开发,那么您可以将CFMutableDictionary与自定义回调结构一起使用:

  • kCFTypeDictionaryKeyCallBackskCFTypeDictionaryValueCallBacks结构复制到新结构中。
  • retainrelease字段设置为NULL,您无需保留/释放(键和/或值)。
  • 在致电CFDictionaryCreateMutable时传递结构。

这样,您将拥有既不保留也不释放的字典。

答案 1 :(得分:1)

为什么需要非参考计数容器?如果您正在存储普通值(如整数),您可以将它们包装在NSValue类型中,如果您有其他类型,但是您不需要那么多引用计数,只需在它之后立即调用“release”你把它添加到容器中。

答案 2 :(得分:1)

您可以使用NSValue方法创建代表每个对象的valueWithPointer:。将值添加到集合中将不会保留引用的对象。这非常严重,因此请考虑是否可能没有更好的方法来实现您的目标,而不是回避所包含对象的容器所有权。

答案 3 :(得分:0)

如果在Mac OS X上,请使用NSMapTable。