0

如果我尝试使用 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 的正确方法。

4

2 回答 2

0

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

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

这是因为对象一旦创建就不会移动,所以对象引用的整数表示在该对象的生命周期内将是一个常量。只需确保在销毁对象之前删除条目,否则最终可能会得到重复的键。

于 2018-02-10T01:34:01.347 回答
0

看看NSMapTable哪个对键和值语义的控制比NS(Mutable)Dictionary.

可以为键指定指针相等性,NSMapTableObjectPointerPersonality而不是要求它们符合NSCopying并提供isEqual:并且hash可以为键指定;在仍然使用对值的强引用的同时NSMapTableStrongMemory,创建一个包含以下内容的表:

[NSMapTable mapTableWithKeyOptions: NSMapTableObjectPointerPersonality
                      valueOptions:NSMapTableStrongMemory]

实例方法是objectForKey:and setObject:forKey: et al,但是你没有得到 get/set 索引语法的简写NS(Mutable)Dictionary

于 2018-02-10T09:38:10.940 回答