Objective c 确保我没有使用任何不可用的API';OSX上有什么?

Objective c 确保我没有使用任何不可用的API';OSX上有什么?,objective-c,xcode,macos,cocoa,Objective C,Xcode,Macos,Cocoa,我正在用Xcode 6编写OSX应用程序,但希望我的应用程序支持OSX 10.7及以上版本。不幸的是,Xcode 6只包含10.10和10.9版本的SDK 确保我没有使用任何会在10.7和10.8上崩溃的不可用API的最佳方法是什么 目前,没有简单的方法可以做到这一点,因为正如您所说,10.9是您可以指定的最远的版本。在Xcode 7发布之前(我相信这只会对更新的SDK有所帮助),您几乎没有选择,一点也不方便: 用10.7和Xcode4或5(10.7SDK随附的任何一个)装载一个便宜的Mac,并

我正在用Xcode 6编写OSX应用程序,但希望我的应用程序支持OSX 10.7及以上版本。不幸的是,Xcode 6只包含10.10和10.9版本的SDK


确保我没有使用任何会在10.7和10.8上崩溃的不可用API的最佳方法是什么

目前,没有简单的方法可以做到这一点,因为正如您所说,10.9是您可以指定的最远的版本。在Xcode 7发布之前(我相信这只会对更新的SDK有所帮助),您几乎没有选择,一点也不方便:

  • 用10.7和Xcode4或5(10.7SDK随附的任何一个)装载一个便宜的Mac,并尝试在那里构建您的项目(这样编译器将自动捕获所有未知的符号)。你甚至可以得到一个功能强大的迷你,让它“无头”(无显示器/键盘/指针设备),并使用远程桌面驱动它。您可以使用托管的repo或共享驱动器访问最新代码,以便与主工作Mac一起进行测试。这确实是最好的概括,因为您应该有办法重现可能只在较旧的OS版本上发生的问题

  • 在现有Mac的内部(或外部)硬盘上保留一个足够大的分区,使用10.7/older Xcode,您可以定期引导到该分区中执行相同的操作。这不如1方便,因为我希望这是显而易见的原因,但如果购买另一台Mac电脑不是可行的选择,这是可行的

  • 最糟糕和最容易出错的方法是手动检查所有代码并查找它们的可用性。这显然很糟糕,但你应该已经知道你自己的应用程序的设计,以及你是否“到目前为止还行”,因此记住这一点,你可以在进行任何新的代码更改/计划的功能时应用这个基本检查

  • [编辑]请参见下面JWWalker的评论

  • 对于我为山姆大叔编写和维护的应用程序(当前版本必须支持10.6),我使用了1和3的混合。也就是说,我保留了一个加载了10.6和Xcode 3的无头Mini,但开发的是最新的硬件/软件。我通过停止和思考我的设计/更改,并通过文档验证所涉及的符号是否可用,从而尽可能合理地审查任何错误修复或小的增强。我是随着这个平台成长起来的,所以我很擅长避免使用更新的API,但在构建内部测试版以供发布时,我偶尔会被发现(这必须在headless Mini上完成,这样它才能捕获任何最终问题)

    然而,在使用新东西时支持旧东西的另一个难题是编辑NIB/XIB。如果您使用较新的工具,较新的IB版本倾向于自动升级格式以“有用”(或强制升级),这意味着它们甚至不能被
    ibtool
    读取。幸运的是,这些天来,我只是对这个应用程序的生产版本的代码发布了错误修复,因为最近的重点是下一个主要版本,幸运的是,它可能针对10.9及以上版本


    我要再次说“这显然很糟糕。”

    虽然它没有得到官方支持,但可能值得尝试使用旧Xcode中的SDK。也就是说,获取一份Xcode 4的副本,深入到应用程序包中查找每个Xcode隐藏SDK的位置,然后将10.7SDK复制或符号链接到Xcode 6中。我还没有具体做到这一点,但我在Xcode 4中使用了Xcode 3中的10.6 SDK。没错,我总是忘记这种方法。主要是因为这一切都很粗糙(而且很容易破碎)。:-)但是很好的理解。如果在前缀或预编译头中说
    #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_7
    ,而使用10.9 SDK呢?@JWWalker在目标构建设置中选择的SDK已经定义了这个宏。除非先取消定义,否则会收到警告。然后。。。因为目标生成设置覆盖了它,所以没有发生任何事情。我认为您关于目标生成设置覆盖它的说法是不对的。在使用10.8 SDK时,我尝试在前缀顶部定义MAC OS X X U版本允许的1070,据我所知,
    MAC OS X U版本允许的
    在编译源代码中实际定义为1070。header AvailabilityMacros.h将定义
    MAC\u OS\u X\u VERSION\u MAX\u ALLOWED
    为SDK版本(如果尚未定义)。这有点麻烦,但您可以从中尝试。我也听说过一些好东西,但从未尝试过。