3

我有一个应用程序使用了仅在 10.7 Lion 中发现的一些类。(例如,NSFileCoordinator。)

当我的应用程序启动时,它可以使用 NSFileCoordinator 来协调对数据存储的读取访问。(我保存为 XML。)

该应用程序在 10.7 Lion 下启动正常,但在 10.6 Snow Leopard 下启动时,应用程序崩溃并出现如下所示的错误。

我的基础 SDK 设置为 10.7,部署目标为 10.6。据我所知,我的所有代码都已正确包装,例如:

if (NSClassFromString(@"NSFileCoordinator") != nil) {
  // Do something the 10.7 way
} else {
  // Do something the 10.6 way
}

但由于某种原因,我仍然看到崩溃。由于Base SDK是10.7,所以我无法在10.6的Xcode下运行应用程序,调试困难。正在将其他消息记录到控制台:

9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173] dyld: Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173]   Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173]   Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173]  in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp

和崩溃报告:

Process:         myapp [137]
Path:            /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
Identifier:      com.me.myapp
Version:         1.5.0 (150)
Code Type:       X86-64 (Native)
Parent Process:  launchd [92]

Date/Time:       2011-09-01 09:40:32.591 -0400
OS Version:      Mac OS X 10.6.8 (10K549)
Report Version:  6

Interval Since Last Report:          2009 sec
Crashes Since Last Report:           5
Per-App Crashes Since Last Report:   5
Anonymous UUID:                      32784C79-0821-471E-BCBF-BE5874774075

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread:  0

Dyld Error Message:
  Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
  Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
  Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
 in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
4

2 回答 2

3

@Anomie 有正确的答案,但让我进一步扩展。这是与您正在执行的操作类似的命令行工具的代码:

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        if (NSClassFromString(@"NSFileCoordinator")) {
            NSLog(@"Version >= 10.7");
        } else {
            NSLog(@"Version <  10.7");
        }
    }

    return 0;
}

该程序链接到的唯一框架是 Foundation。但是为了弱链接到这个框架,您必须执行以下操作:

  1. 在项目浏览器中单击项目
  2. 转到“构建阶段”
  3. 转到“将二进制文件与库链接”并删除“Foundation.framework”
  4. 转到“构建设置”并添加以下“其他链接器标志”:

    -weak_framework 基础

重建你的项目。我已经在 OS X 10.6 和 10.7 上进行了测试,都没有崩溃并且都产生了预期的输出。希望这可以帮助。

于 2011-09-04T17:55:07.893 回答
3

您需要弱链接框架,因此这些未解析的符号在加载时不会出错。

于 2011-09-04T12:32:14.410 回答