我想知道当部署目标不如基础 SDK 时,您如何检查您的代码不会调用不可用的方法?
可以在 SDK 等于部署目标的设备上运行应用程序,但我搜索了一种更“自动”的方式。有什么想法吗?
问候, 昆汀
最佳答案
最简单的方法是使用 __IPHONE_OS_VERSION_MAX_ALLOWED 预处理器定义。
你通过添加来做到这一点
__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2
或类似于目标build设置中的“预处理器宏”选项的内容。您可以在
不幸的是,如果你添加这个定义,它会导致你的预编译头不匹配错误。因此,要解决此问题,您还需要在build设置中关闭“Precompile Prefix Header”选项。
一旦你这样做了,你会得到一堆关于你的目标 SDK 上不存在的类的错误(例如 NSOrderedSet 在 iOS 4.2 中不存在)。如果你想回到 iOS 4 之前的版本,你可能会遇到太多错误,编译器会放弃——我不知道有什么解决方法。在任何情况下,忽略 UIKit header 中有关缺少类的错误,并转到错误列表的底部;每次使用 __IPHONE_OS_VERSION_MAX_ALLOWED 指向的 SDK 中未包含的方法或类时,您都会发现错误。确保这些方法中的每一个都包含在
if( [targetObject respondsToSelector:@selector(thePossiblyMissingSelector:)]
你应该是安全的。可能缺失的类也要测试
if ([NSOrderedSet class] != nil)
但是,这些设置并不是您不小心忘记翻回去的东西。要使其成为测试的自动选项,请执行以下操作:
- 创建一个名为“旧 SDK 测试”之类的新构建配置。
- 仅为此配置定义 __IPHONE_OS_VERSION_MAX_ALLOWED 和预编译头选项(点击build设置中每行旁边的披露箭头以访问每个配置设置)。
- 复制您当前的方案并将其名称设置为“Old SDK Check”之类的名称。
- 将此新方案中运行项的构建配置设置为您在步骤 1 中创建的构建配置。
- 选择新方案并构建。
注意事项:
- 我不保证这会解决您的任何/所有问题。
- UIKit 之外的任何东西都不会被这个检查捕获。
- 这不能替代在您使用的 iOS 版本上测试您的代码 计划支持。
关于iphone - 如果部署目标 < 基本 sdk,如何检查是否使用了不可用的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4437510/