我想在NSDictionary
中存储对象的归零弱引用。这是为了引用父NSDictionary
,因此我可以在不搜索的情况下爬回大型结构。
我不能在这里使用__weak
;即使我的本地引用很弱,NSDictionary
也会存储对弱引用对象的强引用。当然,NSDictionary
不能拥有nil
个对象。
我在iOS上,而不是Mac,所以NSHashTable
不可用。我只希望一个物体变弱;其余的应该仍然很强大。
(我将发布我的答案,所以如果没有更好的答案,我有一些标记为已被接受。但我希望有人有更好的答案。)
答案 0 :(得分:36)
在iOS 6+中,您可以使用NSMapTable并选择是否希望对象和/或键变弱或变强。
答案 1 :(得分:14)
我决定用一个成员定义一个“容器”类,如下所示:
@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];
我认为这对我有用,但似乎疯狂,基金会没有更好的方法。
答案 2 :(得分:6)
有一种内置的方式;只需使用:
[array addObject:[NSValue valueWithNonretainedObject:object]];
然后,要稍后访问该对象,请使用:
id object = [[array objectAtIndex:i] nonretainedObjectValue];
如果该值已经添加,那么“对象”将是iOS 4.x下的无效指针,并且(我假设)在启用ARC的情况下将在5.x以下为零。
编辑:我的假设是错误的 - 它在ARC下并不弱(见下面的讨论)。