我想知道当部署目标不如基本SDK时,如何检查代码是否调用不可用的方法?
可以在SDK等于部署目标的设备上运行应用程序,但我搜索的方式更“自动”。有什么想法吗?
此致 昆汀
答案 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 :(得分: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
}
此处,mipmapBrowserView
是IKImageView
的一个实例,最初是在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)
我找到的最佳方法:用旧SDK编译代码:) link which can help
我认为这个问题与next
我相信有一天Apple允许通过简单定义#define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_3_0
来编译旧SDK的项目
upd:我找到了解决方案here
4.3 5.0和5.1 SDK尝试重新定义此宏后无法编译