Я не уверен на 100% в правильности этого решения, но выкладываю его на всякий случай.
Если вы не хотите использовать CFDictionary, возможно, вы могли бы использовать эту простую категорию:
@implementation NSMutableDictionary(NonCopyableKeys)
- (void)setObject:(id)anObject forNonCopyableKey:(id)aKey {
[self setObject:anObject forKey:[NSValue valueWithPointer:aKey]];
}
- (id)objectForNonCopyableKey:(id)aKey {
return [self objectForKey:[NSValue valueWithPointer:aKey]];
}
- (void)removeObjectForNonCopyableKey:(id)aKey {
[self removeObjectForKey:[NSValue valueWithPointer:aKey]];
}
@end
Это обобщение аналогичного метода, который я видел в Интернете (не могу найти исходный источник) для использования NSMutableDictionary, который может хранить объекты с ключами UITouch.
То же самоеприменяется ограничение, как в ответе Чака: объект, который вы используете в качестве ключа, не должен изменяться таким образом, чтобы влиять на его значение хеш-функции, и не должен освобождаться, пока он находится в словаре.
Также убедитесь, что вы неt смешайте -(void)setObject:(id)anObject forNonCopyableKey:(id)aKey
и - (id)objectForKey:(id)aKey
методы, так как они не будут работать (последний вернет nil
).
Кажется, это работает нормально, но могут быть некоторые нежелательные побочные эффекты, которые яне думая о.Если кто-нибудь узнает, что у этого решения есть какие-либо дополнительные проблемы или предостережения, пожалуйста, прокомментируйте.