在构建多个iOS版本时处理已弃用的符号和方法

时间:2010-12-10 15:59:46

标签: cocoa-touch macos iphone-sdk-3.0 ios4 deprecated

我是一名正在过渡到iPhone世界的c ++开发人员,我很想获得一些帮助。

比方说,MPMoviePlayerController用于在iOS 3.1及更早版本中发布MPMoviePlayerContentPreloadDidFinishNotification通知。

但是,现在不推荐使用此通知。

我希望我的应用能够在iOS 3及更高版本的每部iPhone上运行。

如果我正在使用base sdk 4.2开发,当我在带有iOS 3.2的iphone上安装我的应用程序时会发生什么?该应用程序是否附带链接到它的sdk(例如mfc静态链接)?

如果我理解正确,例如在iPhone上使用iOS 3.2,该通知仍会被调用。 (如果我在较早的sdk上调用函数,假设它不像我上面提到的那样静态链接。)

这是否意味着如果我现在正在编写新应用,我仍然需要处理这些已弃用的通知?

我无法理解这一点,并希望得到任何解释。

由于

1 个答案:

答案 0 :(得分:2)

如果您在运行3.2的设备上使用iOS 4.2附带的符号,则会遇到崩溃。

解决这个问题的方法是根据它们是否在运行时可用而有条件地使用新符号。

例如

if (&NewNotificationSymbol != NULL)
{
    // awesome, it's not NULL, we can use it
}
else
{
    // not so awesome, we'll use the old, deprecated one
    // but at least we won't crash
}

同样的方法可以用于4.x上运行时在4.x上新增的类:

if (NSClassFromString(@"MyAwesomeNewClass") != nil)
{
    // awesome, it's not NULL, we can use it
}
else
{
    // not so awesome, we'll use the old, deprecated one
    // but at least we won't crash
}

根据经验,您应该始终编译并链接开发人员工具提供的最新iOS SDK,然后将您的部署目标构建设置设置为您希望支持的最旧版本的iOS。然后使用这些条件来使用新功能并优雅地回退,如果它们不可用则不会崩溃。