2010-01-06 58 views
1

如果我将iPhone应用程序的Base + Active SDK设置为3.0并将部署目标设置为2.2,我可以使用2.2版本的新版本函数设备?使用iPhone OS 3.0函数调用代替2.2设备上不推荐使用的2.2函数调用

例如,UITableViewCell现在需要使用[cell.imageView setImage:image]来设置图像,而在2.2中,您可以拨打[cell setImage:image]。 2.2设备上会不会使用新的[cell.imageView setImage:image]崩溃?

回答

3

不,你不能在我们的OS 3.0调用2.2。至少在操作系统3中,弃用的方法应该是正常的。在许多情况下,在操作系统中弃用,只是表示苹果推荐使用新方法而不推荐使用新方法;但这些方法也可能在未来消失。

您有几种选择:

  1. 根本无视警告,只要应用程序和方法上的OS 3.0的实际工作。
  2. 有一个运行时检查,以确定操作系统版本,并调用适当的方法:

    double version = [[[UIDevice currentDevice] systemVersion] doubleValue]; 
    if (version >= 3.0) { 
        [cell.imageView setImage:image]; 
    } else { 
        [cell setImage:image]; 
    } 
    

    或更好:

    if ([cell respondsToSelector:@selector(imageView)]) { 
        [cell.imageView setImage:image]; 
    } else { 
        [cell setImage:image]; 
    } 
    

    注意,编译时检查,使用ifdef指令赢得” t工作

  3. 删除OS 2.2支持。由于3.X的吸收率相当高,因此您仅以3.0为目标是相当合理的。在我的小应用程序中,在12月份,我有2,058位用户使用3.0系统之前的27位用户。不用说,这个选项可以显着减少您的测试需求。

+1

不够公平 - 我希望在部署目标被适当设置时,系统会在编译时挑选新的函数调用。我个人更喜欢使用'if([cellrespondsToSelector:@selector(imageView)])'作为我的运行时检查,但我确定这是一个偏好问题;) – Ted 2010-01-06 13:06:08

+0

我加了你的建议。 respondsToSelector肯定比操作系统检查我的意见更好,只是忘了它! Objective-C是一种动态语言,因此在编译时方法不会得到解决。 – notnoop 2010-01-06 13:11:33

+0

不错的。我仍然好奇,但是会[''cell.imageView setImage:image]'刚刚在运行时崩溃了2.2?不幸的是,我没有2.2设备进行测试。 – Ted 2010-01-06 13:18:49

1

不,您不能在2.x设备上使用OS 3.0调用。如果你甚至可以在2.x设备上安装一个基于3.0的应用程序,我会很惊讶。

+1

嗨, 我认为你误解了 - 部署目标设置为2.2(根据Apple最佳实践)。 – Ted 2010-01-06 12:39:47

+0

这里有几件事情:BASE SDK,部署目标和ACTIVE SDK。您可以将BASE SDK设置为任何您想要的,但是,只有在ACTIVE SDK设置为3.0或更高版本之前,针对(例如)3.0 SDK的API调用将不可用(即不会编译)。部署目标将允许您在2.x目标上安装3.0-active-SDK,但不会运行。 – 2010-01-06 12:55:11

+0

所以我会在2.2上调用'[cell.imageView setImage:image]'时在运行时崩溃? – Ted 2010-01-06 12:58:06