【问题标题】:Core Data primitive accessor methods valid for iPhone?核心数据原始访问器方法对 iPhone 有效吗?
【发布时间】:2011-05-24 05:32:51
【问题描述】:

关于原始访问器方法(Core Data 对象中的 setPrimitive*YourAttribute*setPrimitiveValue:*value* forKey:@"*YourAttribute*" 形式)是否适用于 iPhone 代码或仅适用于 Mac,我得到了不同的信号。一方面,Apple 文档没有'似乎没有提到它们可用于 iOS,只是 Mac OS X v10.5。另一方面,它们可以与我的 iPhone 应用程序的代码一起使用,尽管有编译器警告,例如“找不到方法 xxxx(返回类型默认为 'id ')"。

有人能以一种或另一种方式确认吗?

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

    在 Core Data Programming Guide 的 Managed Object Accessor Methods 概述部分中,它声明原始访问器会自动为您生成,但您需要声明属性以抑制编译器警告。您说使用原始访问器在您的代码中有效(即使有警告),所以它似乎在 iOS 中受支持。

    Apple 的文档页面似乎并不总是严格地提及给定功能在各种操作系统中的可用性。

    【讨论】:

    • 那是我看到的同一个文档,所以我会将此标记为答案,除非/直到有人提出相反的意见。
    • 我按照文档声明了我的属性,但我仍然收到有关原始访问器不存在的警告。事实上,在 Xcode 4 中,您可以通过在模型编辑器中选择对象并单击“Editor->Create NSManagedObject subclass...”来创建 NSManagedObject 的子类。当你这样做时,你会发现自动生成的代码给出了相同的编译器警告并且属性已经被声明了。如何解决此警告?
    • 在 Apple 的文档中,他们给出了自定义访问器的示例。 Apple 的示例实际上声明了原始方法(但没有在实现中定义它们,因为它们是动态生成的)。鉴于 Apple 这样做,这似乎是修复编译器警告的首选方法。这是文档链接:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
    • 嗯...所以我按照 Apple 的示例进行操作,但仍然收到编译器警告。现在我得到“不完整的实现”,因为我还没有实现 setPrimitive.
    • @Jason 请参阅here,了解如何抑制“未完成实施”警告。
    【解决方案2】:

    您可以改用 NSNumber。例如,对于布尔值,您将拥有,[NSNumber numberWithInt:0] 表示 NO,[NSNumber numberWithInt:1] 表示 YES。与整数、双精度数、浮点数相同的逻辑。这种方式要容易得多。您的属性将类似于: NSNumber *myInteger ,您只需在检索或存储它时对其进行装箱和拆箱。我就是这样做的。

    【讨论】:

    • 好吧。是的,你可以这样做。但是,如果您出于任何原因想要在不触发 KVO 通知的情况下访问或设置属性,则原始方法是一个合理的解决方案。这通常用于NSManagedObject 子类中的自定义setter 或getter。但是请注意实现正确的 willAccessValueForKey 和其他 KVO 函数以使其正常工作。
    • 你是对的,通常你应该将数字存储为NSNumber对象。
    • 正如 GorillaPatch 所指出的,它能够抑制我所追求的 KVO 通知。除了优点之外,您的 cmets 还向我确认,共识是原始访问器实际上是对 IOS 的支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多