gpt4 book ai didi

cocoa - NSManagedObject 作为 NSDictionary 键?

转载 作者:行者123 更新时间:2023-12-03 16:01:59 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个 NSDictionary,其键应该是 NSManagedObject 子类的实例。

但是,问题是 NSManagedObject 没有实现 NSCopying 协议(protocol),这意味着 NSManagedObject 的核心数据对象/实例不能即使 -[hash] 方法对它们来说效果很好,也可以用作字典键。

我应该做什么?

最佳答案

有四个选项:

  1. 使用不同的对象作为字典键,并从中查找。 [object objectID]+[NSValue valueWithNonretainedObject:] 似乎是最明显的
  2. 使用 CFDictionaryCreateMutable() 创建一个带有保留键的字典,而不是复制,然后调用 CFDictionarySetValue() 来存储对象
  3. 在 OS X 或 iOS6+ 上,[NSMapTable mapTableWithStrongToStrongObjects] 为您提供相当于 CFMutableDictionary 的纯 Objective-C
  4. 为您的托管对象子类实现 NSCopying,以便它返回 self(如果您不使用 ARC,则返回引用计数)

注释

+valueWithNonretainedObject: 非常危险,因为可能会留下悬空指针;可能最好避免。

存储对象 ID 很好,除了对象以临时 ID 开始生命这一事实之外。当上下文保存到磁盘时(或调用 -obtainPermanentIDsForObjects:... ),该 ID 将更改为永久 ID。您的映射代码需要足够智能才能处理此问题,除非它可以保证所有传入对象都已经拥有永久 ID。

像这样实现 NSCopying 感觉有点恶心,但应该可以正常工作。碰巧,这正是 NSURLSessionTask 所采用的方法,我认为是为了字典友好性。

在 OS X 10.8 Mountain Lion 之前,可以创建常规 NSMutableDictionary,然后为其调用 CFDictionarySetValue()。但现在情况不再是这样了;新词典现在在 CF 级别指定了正确的复制回调,而不是纯粹作为 NSMutableDictionary 的一项功能。

关于cocoa - NSManagedObject 作为 NSDictionary 键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com