使用 Core Data 时的向后兼容性

Posted

技术标签:

【中文标题】使用 Core Data 时的向后兼容性【英文标题】:Backwards compatibility when using Core Data 【发布时间】:2010-05-26 00:23:43 【问题描述】:

谁能解释为什么我的应用程序在 iPhone OS 2.2.1 上崩溃并出现以下错误

dyld: Symbol not found: _OBJC_CLASS_$_NSPredicate
  Referenced from: /var/mobile/Applications/456F243F-468A-4969-9BB7-A4DF993AE89C/AppName.app/AppName
  Expected in: /System/Library/Frameworks/Foundation.framework/Foundation

我的 CoreData.framework 链接较弱,基础 SDK 设置为 3.0,部署目标设置为 SDK 2.2

该应用程序已经使用了其他可用的 3.0 功能,我对此没有任何问题。但显然用于其他功能的向后兼容方法不适用于 Core Data。

应用程序在应用代理的 applicationDidFinishLaunching 被调用之前崩溃。

这是调试器日志:

[Session started at 2010-05-25 20:17:03 -0400.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1119) (Thu May 14 05:35:37 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "--host=i386-apple-darwin --target=arm-apple-darwin".tty /dev/ttys001
Loading program into debugger…
sharedlibrary apply-load-rules all
warning: Unable to read symbols from "MessageUI" (not yet mapped into memory).
warning: Unable to read symbols from "CoreData" (not yet mapped into memory).
Program loaded.
target remote-mobile /tmp/.XcodeGDBRemote-12038-42
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running…
[Switching to thread 10755]
[Switching to thread 10755]
Re-enabling shared library breakpoint 1
Re-enabling shared library breakpoint 2
Re-enabling shared library breakpoint 3
Re-enabling shared library breakpoint 4
Re-enabling shared library breakpoint 5
(gdb) continue
warning: Unable to read symbols for ""/Users/alex/iPhone Projects/AppName/build/Debug-iphoneos"/AppName.app/AppName" (file not found).
dyld: Symbol not found: _OBJC_CLASS_$_NSPredicate
  Referenced from: /var/mobile/Applications/456F243F-468A-4969-9BB7-A4DF993AE89C/AppName.app/AppName
  Expected in: /System/Library/Frameworks/Foundation.framework/Foundation

(gdb) 

【问题讨论】:

【参考方案1】:

如果您不想向后兼容 iPhone OS 2.2,显然您不能通过文字类符号引用 NSPredicate

因此将我对 NSPredicate 的引用更改为:

[fetchRequest setPredicate:[NSClassFromString(@"NSPredicate") predicateWithFormat:@"EntryId == %@", [NSNumber numberWithInt: index]]];

现在可以使用了。

见https://devforums.apple.com/message/225591#225591

【讨论】:

【参考方案2】:

抱歉,请重新阅读您的问题。看起来框架本身不能弱链接。我想这意味着您不能使用 Core Data 框架来拥有 2.x 目标:(

即整个框架在目标平台上不可用,不适用弱链接。

【讨论】:

感谢您的回答。对于 3.0 中引入的其他框架,例如 MediaPlayer 和 MessageUI,难道不是同样的情况吗?它们也不存在于目标平台上。 也许吧。可能是您无意中使用了NSPredicate,它不是专门的Core Data,而是由它提供的。您是否确认没有通过断点到达applicationDidFinishLaunching?您链接/使用的课程类别是否需要NSPredicate 不在其他任何地方使用 NSPredicate。我在 applicationDidFinishLaunching 的开头设置了断点,应用程序在点击它之前崩溃了。

以上是关于使用 Core Data 时的向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章

更改 Spring Boot 外部化配置时的向后兼容性

Android Studio 中的向后兼容性是啥?

Android Studio 上的向后兼容性 (AppCompat)

升级 Newtonsoft.JSON 是不是存在任何已知的向后兼容性问题?

xml 保持与XML的向后兼容性

如何保持从 Blender 导出的 Three.js JSON 文件的向后兼容性