弱的对象在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。
编辑:我的假设是错误的 – 在弧下它不弱(见下面的讨论)。