Iphone 如果部署目标<;基本sdk?
我想知道,当部署目标低于基本SDK时,如何检查代码是否不调用不可用的方法 在SDK等于部署目标的设备上运行应用程序是可能的,但我选择了一种更“自动”的方式。有什么想法吗 问候,,Iphone 如果部署目标<;基本sdk?,iphone,objective-c,ios,compatibility,Iphone,Objective C,Ios,Compatibility,我想知道,当部署目标低于基本SDK时,如何检查代码是否不调用不可用的方法 在SDK等于部署目标的设备上运行应用程序是可能的,但我选择了一种更“自动”的方式。有什么想法吗 问候,, 昆汀使用NSClassFromString() 这是你在找的吗?你在找类似的东西吗 -(BOOL)respondsToSelector:(SEL)aSelector如果您有一个类的实例,可以使用以下命令查看它是否理解您要调用的方法: if ([mipmapBrowserView respondsToSelector:@
昆汀使用
NSClassFromString()代码>
这是你在找的吗?你在找类似的东西吗
-(BOOL)respondsToSelector:(SEL)aSelector如果您有一个类的实例,可以使用以下命令查看它是否理解您要调用的方法:
if ([mipmapBrowserView respondsToSelector:@selector(setBackgroundColor:)]) {
// set the background layer since IKImageView supports it
}
这里,mipmapBrowserView
是最先在Mac OS X 10.5中引入的iImageView
的一个实例。IKImageView的setBackgroundColor:
方法只是在10.6中添加的,所以我需要在调用它之前进行检查。这使我能够基于10.6SDK进行构建,并利用新功能,但仍然支持OSX10.5。虽然本例涉及OSX而不是iOS,但同样的方法(双关语?)也适用于iOS
请注意,当您对一个类进行子类化时,情况略有不同,您想知道超类是否响应某个选择器:
“无法通过使用super关键字向对象发送respondsToSelector:来测试对象是否从其超类继承方法。此方法仍将作为一个整体测试对象,而不仅仅是测试超类的实现。因此,将respondsToSelector:发送到super相当于将其发送到self。相反,您必须直接在对象的超类上调用NSObject类方法InstanceRespondToSelector:”
我发现最好的方法是:使用旧SDK编译代码:)
我认为这个问题与我的想法有关
我相信有一天苹果会允许通过简单的定义来编译旧SDK的项目
我找到了解决办法
4.3 5.0和5.1 SDK在尝试重新定义此宏后无法编译最简单的方法是使用允许的预处理器定义的IPHONE OS版本
您可以通过添加
__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_4_2
或者类似于目标的生成设置中的“预处理器宏”选项。您可以在中查找可用的版本
不幸的是,如果添加此定义,将导致与预编译头不匹配的错误。因此,要解决此问题,还需要关闭生成设置中的“预编译前缀头”选项
一旦您这样做了,您将得到一系列目标SDK上不存在的类的错误(例如,iOS 4.2中不存在SensorDerSet)。如果您试图返回iOS 4之前的版本,您可能会遇到太多错误,以致编译器无法处理--我不知道有什么解决方法。在任何情况下,请忽略UIKit标题中缺少类的错误,并转到错误列表的底部;在那里,您应该在每次使用未包含在中的方法或类时都会发现一个错误允许IPHONE OS版本MAX指向的SDK。请确保每个方法都包含在
if( [targetObject respondsToSelector:@selector(thePossiblyMissingSelector:)]
您应该是安全的。可能丢失的类也应该进行测试
if ([NSOrderedSet class] != nil)
但是,这些设置并不是您希望意外忘记翻转的。要使其成为测试的自动选项,请执行以下操作:
创建一个名为“旧SDK测试”的新构建配置
仅为此配置定义允许的IPHONE版本和预编译头选项(点击构建设置中每行旁边的显示箭头以访问每个配置设置)
复制当前方案,并将其名称设置为“Old SDK Check”
将此新方案中运行项的生成配置设置为在步骤1中创建的生成配置
选择新方案并生成
注释:
- 我不能保证这会抓住你的任何/所有问题
- 此支票不会记录UIKit之外的任何内容
- 这不能替代在您需要的iOS版本上测试代码
计划支持
我认为他希望在低于基本sdk的iOS上对缺少的方法发出编译时警告。XCode只会在编译时为当前安装的基本sdk发出警告,所以我认为这是不可能的。如果只需要测试一台设备,你可以为该设备编写一系列测试用例并运行这些测试用例。没错!就是这样ot可能:(.if的可能副本([SensorDeredSet类]!=nil)在iOS 4.2+上运行得更好,编译时带有LLVM 1.6+。(请参阅)
if ([NSOrderedSet class] != nil)