Ответ 1
Существует четыре варианта:
- Вместо этого используйте другой объект в качестве словарного ключа и найдите его.
[object objectID]
или+[NSValue valueWithNonretainedObject:]
кажутся наиболее очевидными - Используйте
CFDictionaryCreateMutable()
для создания словаря с сохраненными ключами вместо скопированного вместо него, а затем вызывайтеCFDictionarySetValue()
для хранения объектов - В OS X или iOS6 +,
[NSMapTable mapTableWithStrongToStrongObjects]
вы получаете чисто Objective-C эквивалентCFMutableDictionary
- Внедрите
NSCopying
для вашего подкласса управляемого объекта, чтобы он возвращал self (с подсчетом ссылок, если вы не используете ARC)
Примечания
+valueWithNonretainedObject:
довольно опасен, так как его можно оставить с висящим указателем; вероятно, лучше всего избегать.
Сохранение идентификаторов объектов прекрасно, кроме того, что новые объекты начинают жизнь с временным идентификатором. Затем этот идентификатор изменяется на постоянный, когда контекст сохраняется на диск (или вызывается -obtainPermanentIDsForObjects:…
). Ваш код сопоставления должен быть достаточно умным, чтобы справиться с этим, если он не может гарантировать, что все входящие объекты уже имеют постоянный идентификатор.
Реализация NSCopying
, как это чувствует себя немного icky, но должно работать нормально. Как это бывает, это именно подход NSURLSessionTask
принимает, я полагаю, что для удобства словаря.
До OS X 10.8 Mountain Lion раньше можно было создать обычный NSMutableDictionary
, а затем вызвать CFDictionarySetValue()
для него. Однако это не так. теперь в новых словарях есть надлежащие обратные вызовы копирования, указанные на уровне CF, а не только как функция NSMutableDictionary
.