NSDictionary中的弱对象?

时间:2012-01-05 19:46:14

标签: ios nsdictionary automatic-ref-counting weak-references

我想在NSDictionary中存储对象的归零弱引用。这是为了引用父NSDictionary,因此我可以在不搜索的情况下爬回大型结构。

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

我在iOS上,而不是Mac,所以NSHashTable不可用。我只希望一个物体变弱;其余的应该仍然很强大。

(我将发布我的答案,所以如果没有更好的答案,我有一些标记为已被接受。但我希望有人有更好的答案。)

3 个答案:

答案 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下并不弱(见下面的讨论)。