如果部署目标<如何检查是否使用了可用的方法?基地sdk?

时间:2010-12-14 09:12:40

标签: iphone objective-c ios compatibility

我想知道当部署目标不如基本SDK时,如何检查代码是否调用不可用的方法?

可以在SDK等于部署目标的设备上运行应用程序,但我搜索的方式更“自动”。有什么想法吗?

此致 昆汀

5 个答案:

答案 0 :(得分:3)

最简单的方法是使用__IPHONE_OS_VERSION_MAX_ALLOWED预处理器定义。

您可以通过添加

来完成此操作
__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2

或与目标的Build Settings中的“Preprocessor Macros”选项类似的内容。您可以在< Availability.h>。

中查找可用的版本

不幸的是,如果你添加这个定义,它将导致你的预编译头不匹配错误。因此,要解决此问题,您还需要在构建设置中关闭“预编译前缀标题”选项。

执行此操作后,您会在目标SDK上不存在的类中遇到一堆错误(例如,iOS 4.2中不存在NSOrderedSet)。如果你试图回到iOS 4之前的版本,你可能会遇到编译器失败的错误 - 我不知道有什么办法可以解决这个问题。在任何情况下,忽略UIKit头中缺少类的错误,并转到错误列表的底​​部;每次使用__IPHONE_OS_VERSION_MAX_ALLOWED指向的SDK中未包含的方法或类时,都应该找到错误。确保每个方法都包含在

if( [targetObject respondsToSelector:@selector(thePossiblyMissingSelector:)]

你应该安全。也应该测试可能缺少的类

if ([NSOrderedSet class] != nil)

然而,这些设置不是您想要意外忘记翻转的设置。要使其成为测试的自动选项,请执行以下操作:

  1. 创建一个名为“Old SDK Testing”的新构建配置。
  2. 仅为此配置定义__IPHONE_OS_VERSION_MAX_ALLOWED和预编译头选项(点击Build Settings中每行旁边的显示箭头以访问每个配置设置)。
  3. 复制您当前的Scheme并将其名称设置为“Old SDK Check”。
  4. 将此新方案中的Run项目的Build Configuration设置为您在步骤1中创建的构建配置。
  5. 选择新的Scheme并进行构建。
  6. 备注

    • 我不保证这会解决您的任何/所有问题。
    • UIKit以外的任何东西都不会被这张支票抓住。
    • 这不能替代您在iOS版本上测试代码 计划支持

答案 1 :(得分:2)

使用NSClassFromString();

Class cls = NSClassFromString(@"YourClass");
if (cls == nil)

这是你要找的吗?

答案 2 :(得分:0)

你在寻找类似的东西吗?   - (BOOL)respondsToSelector:(SEL)aSelector

答案 3 :(得分:0)

如果您有一个类的实例,您可以使用以下内容来查看它是否理解您要调用的方法:

if ([mipmapBrowserView respondsToSelector:@selector(setBackgroundColor:)]) {
    // set the background layer since IKImageView supports it
}

此处,mipmapBrowserViewIKImageView的一个实例,最初是在Mac OS X 10.5中引入的。 IKImageView的setBackgroundColor:方法仅在10.6中添加,因此我需要在调用之前进行检查。这允许我构建10.6 SDK,并利用新功能,但仍然支持OS X 10.5。虽然这个例子涉及OS X而不是iOS,但同样的方法(双关语意图?)也适用于iOS。

请注意,当您对类进行子类化时,情况会略有不同,并且您想知道超类是否响应某个选择器:

  

“你无法通过使用super关键字向对象发送一个对象来测试对象是否从其超类继承了一个方法。这个方法仍然是整个对象的测试,而不仅仅是超类的实现。因此,发送respondsToSelector :to super相当于将它发送给self。相反,你必须直接在对象的超类上调用NSObject类方法instancesRespondToSelector:“

答案 4 :(得分:0)

  1. 我找到的最佳方法:用旧SDK编译代码:) link which can help

  2. 我认为这个问题与next

  3. 有关
  4. 我相信有一天Apple允许通过简单定义#define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0来编译旧SDK的项目

  5. upd:我找到了解决方案here

  6. 4.3 5.0和5.1 SDK尝试重新定义此宏后无法编译