NSDictionary中的弱对象?

Ste*_*her 19 weak-references nsdictionary ios automatic-ref-counting

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

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

我在iOS上,而不是Mac,因此NSHashTable无法使用.我只希望一个物体变弱; 其余的应该仍然很强大.

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

Joã*_*nes 37

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

  • NSMapTable可能无法按预期运行:http://cocoamine.net/blog/2013/12/13/nsmaptable-and-zeroing-weak-references/ (4认同)
  • 显然是今天和前进的最佳答案.谢谢. (2认同)

Ste*_*her 15

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

@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
Run Code Online (Sandbox Code Playgroud)

并使用它:

id parentRef = [[Parent alloc] initWithParent: parent];
[newElement setObject: parentRef forKey: ParentKey];
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*ood 6

有内置的方式; 只需使用:

[array addObject:[NSValue valueWithNonretainedObject:object]];
Run Code Online (Sandbox Code Playgroud)

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

id object = [[array objectAtIndex:i] nonretainedObjectValue];
Run Code Online (Sandbox Code Playgroud)

如果该值已经添加,那么"对象"将是iOS 4.x下的无效指针,并且(我假设)在启用ARC的情况下将在5.x以下为零.

编辑:我的假设是错误的 - 它在ARC下并不弱(见下面的讨论).

  • 不,这是一个悬垂的指针.但是感谢你的想法.:) (3认同)
  • @Eiko,你错了。这是观察者模式的常见情况。 (2认同)