弱的对象在NSDictionary?

我想存储在NSDictionary的对象的归零弱引用。 这是为了参考一个父NSDictionary ,所以我可以爬行备份大型结构,而不search。

我不能在这里使用__weak ; 即使我的本地引用很弱, NSDictionary也会存储一个强引用,这个对象被弱引用。 而且,当然, NSDictionary不能nil对象。

我在iOS上,而不是Mac,所以NSHashTable不可用。 我只想要一个对象变弱。 其余的依然强大。

(我要发布我的答案,所以如果没有更好的答案,我有一些可以接受的东西,但我希望有人有更好的答案。)

在iOS 6 +中,您可以使用NSMapTable,并select是否希望对象和/或键变弱或变强。

我已经决定用单个成员来定义一个“容器”类,如下所示:

 @interface Parent : NSObject @property (nonatomic, weak) id parent; @end @implementation Parent @synthesize parent = _parent; - (id)initWithParent: (id)parent; { if (( self = [super init] )) { _parent = parent; } return self; } @end 

并使用它:

 id parentRef = [[Parent alloc] initWithParent: parent]; [newElement setObject: parentRef forKey: ParentKey]; 

我认为这对我有用,但似乎很疯狂 ,没有更好的方法build立到基金会。

有一个内置的方式; 只是使用:

 [array addObject:[NSValue valueWithNonretainedObject:object]]; 

然后稍后访问该对象,请使用:

 id object = [[array objectAtIndex:i] nonretainedObjectValue]; 

如果这个值自你添加之后已经被释放,那么在iOS 4.x下,“object”将是一个无效的指针,并且(我假设)在启用ARC的情况下将会是5.x。

编辑:我的假设是错误的 – 在弧下它不弱(见下面的讨论)。