在NSMutableDictionary

时间:2018-02-09 19:16:27

标签: macos cocoa nsdictionary nsvalue

如果我尝试使用dispatch_source_t作为NSMutableDictionary中的键:

dispatch_source_t               source = dispatch_source_create(stuff...);
NSMutableDictionary             filesAndSources = [NSMutableDictionary dictionary];

filesAndSources[source] = @{stuff goes here};

我收到警告:

Sending 'dispatch_source_t' (aka 'NSObject<OS_dispatch_source> *') to parameter of incompatible type 'id<NSCopying> _Nonnull'

我认为是因为dispatch_source_t没有使用NSCopying协议。我的解决方案是将dispatch_source_t填充到NSValue中:

NSValue*          val = [NSValue valueWithPointer:(__bridge const void* _Nullable)(source)];
filesAndSources[val] = @{stuff};

这会让警告平静,但我不确定这是否是传递dispatch_source_t的正确方法。

2 个答案:

答案 0 :(得分:0)

如果您只想将调度源对象引用用作字典中的键,并且您知道所有用作键的对象都存在且有效(这是一个重要的要求),然后你可以将指针值用作整数键:

sources[ @( (intptr_t)source ) ] = @{stuff};

这是因为对象在创建后不会移动,因此对象引用的整数表示将是该对象生命周期的常量。只需确保在销毁对象之前删除该条目,否则最终可能会出现重复的密钥。

答案 1 :(得分:0)

查看NSMapTable,它比NS(Mutable)Dictionary更能控制键和语义。

可以为密钥指定指针相等性NSMapTableObjectPointerPersonality,而不是要求它们符合NSCopying,并且可以为密钥指定isEqual:hash;同时仍然使用值NSMapTableStrongMemory的强引用,创建一个表格:

[NSMapTable mapTableWithKeyOptions: NSMapTableObjectPointerPersonality
                      valueOptions:NSMapTableStrongMemory]

实例方法有objectForKey:setObject:forKey: ,但您无法获得NS(Mutable)Dictionary提供的get / set索引语法缩写。