然而,问题是NSManagedobject不实现NScopying协议,这意味着即使 – [hash]方法可以正常工作,NSManagedobject的Core Data对象/实例也不能用作字典密钥。
我该怎么办?
解决方法 有四个选项:>使用不同的对象作为字典键,然后从中查找。 [object objectID]或[NSValue valueWithNonretainedobject:]似乎是最明显的
>使用CFDictionaryCreateMutable()创建具有保留的键而不是复制的字典,然后调用CFDictionarySetValue()来存储对象
>在OS X或iOS6上,[NSMaptable maptableWithStrongToStrongObjects]给你一个纯Objective-C等价于cfmutabledictionary
>为您的托管对象子类实现NScopying,使其返回自身(如果您没有使用ARC,则会带有一个凸起的引用计数)
笔记
valueWithNonretainedobject:很危险,因为可能留下悬挂指针;最好避免。
存储对象ID是很好的,除了新对象使用临时ID开始使用的事实。当上下文保存到磁盘(或-obtainPermanentIDsForObjects:…被调用)时,该ID将更改为永久的ID。您的映射代码需要足够聪明才能处理这一点,除非可以保证所有传入对象都具有永久ID。
像这样执行NScopying感觉有点狡猾,但应该工作正常。正因为如此,这正是NSURLSessionTask采取的方法,我认为字典友善。
在OS X 10.8 Mountain lion之前,以前可以创建一个常规的NSMutableDictionary,然后调用CFDictionarySetValue()。不过情况已经不复存在了现在,新的字典具有在CF级别指定的适当的复制回调,而不是纯粹是NSMutableDictionary的一个功能。
总结以上是内存溢出为你收集整理的可可 – NSManagedObject作为NSDictionary键?全部内容,希望文章能够帮你解决可可 – NSManagedObject作为NSDictionary键?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)