关于NSClassFromString /检查手势识别器的困惑

Qia*_* Yi 3 cocoa-touch objective-c ios ios-3.x

我正在尝试使用NSClassFromString来防止代码块在iOS 3.2之前的设备上运行.有问题的代码块如下:

if (NSClassFromString(@"UITapGestureRecognizer"))
{
    UITapGestureRecognizer *tap = [[[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard)] autorelease];
    [tap setCancelsTouchesInView:NO];
    [[self view] addGestureRecognizer:tap];
}
Run Code Online (Sandbox Code Playgroud)

我这样做是因为Apple的文档声明UITapGestureRecognizer与3.2之前的安装无法比较.https://developer.apple.com/library/ios/#documentation/uikit/reference/UITapGestureRecognizer_Class/Reference/Reference.html

我原本以为当我在这个设备上运行它时,使用NSClassFromString将返回nil,但事实并非如此.该语句为真,代码执行.(有趣的是,代码类型适用于3.2之前的安装.)

无论如何,我想知道为什么NSClassFromString没有返回nil,并且有什么我可以做的其他方式来完成我想要做的事情?

谢谢!

*这是我正在运行的设备:

忙碌的猫http://f.cl.ly/items/2H3R243s1Q3W343f2N0w/version_stackOverflowPost.png

Vik*_*ica 8

来自文档

用法特别注意事项

要确定某个类是否在运行时在给定的iOS版本中可用,通常会检查该类是否为nil.不幸的是,对于UIGestureRecognizer来说,这个测试并不完全准确.虽然这个类是从iOS 3.2开始公开发布的,但在此之前的一段时间内它还处于开发阶段.虽然该类存在于早期版本中,但在早期版本中不支持使用它和其他手势识别器类.您不应尝试使用这些类的实例.

要在运行时确定是否可以在应用程序中使用手势识别器,请测试该类是否存在,如果存在,则分配实例并查看它是否响应选择器locationInView:.在iOS 3.2之前,此方法未添加到类中.代码可能如下所示:

UIGestureRecognizer *gestureRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)];

if (![gestureRecognizer respondsToSelector:@selector(locationInView:)]) {
    [gestureRecognizer release];
    gestureRecognizer = nil;
}
// do something else if gestureRecognizer is nil
Run Code Online (Sandbox Code Playgroud)