如果我尝试使用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的正确方法。
答案 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索引语法缩写。