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

Posted

技术标签:

【中文标题】关于 NSClassFromString / 检查手势识别器的困惑【英文标题】:Confusion concerning NSClassFromString / Checking for Gesture Recognizer 【发布时间】:2012-02-03 20:01:26 【问题描述】:

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

if (NSClassFromString(@"UITapGestureRecognizer"))

    UITapGestureRecognizer *tap = [[[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard)] autorelease];
    [tap setCancelsTouchesInView:NO];
    [[self view] addGestureRecognizer:tap];

我这样做是因为 Apple 的文档指出 UITapGestureRecognizer 与 3.2 之前的安装不兼容。 https://developer.apple.com/library/ios/#documentation/uikit/reference/UITapGestureRecognizer_Class/Reference/Reference.html

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

无论如何,我想知道为什么 NSClassFromString 没有返回 nil,我还能做些什么来完成我想要做的事情吗?

【问题讨论】:

【参考方案1】:

来自docs

使用特殊注意事项

判断一个类是否可用 在给定 iOS 版本的运行时,您通常会检查 类是零。不幸的是,这个测试对于 UIGestureRecognizer。虽然这门课是公开的 从 iOS 3.2 开始,它在很短的时间内处于开发阶段 那。尽管该类存在于较早的版本中,但使用它和 之前不支持其他手势识别器类 释放。您不应尝试使用这些类的实例。

在运行时确定是否可以在 您的应用程序,测试该类是否存在,如果存在, 分配一个实例并查看它是否响应选择器 位置视图:。这个方法直到 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

【讨论】:

是的,我认为 Apple 在其中一个 WWDC 视频中也提到了这一点,这是需要注意的特殊情况。其他人之前也遇到过同样的问题:nanoant.com/apple/wanna-be-3-x-compatible-not-so-simple【参考方案2】:

可能发生的是 UITapGestureRecognizer 存在但在 3.1.3 中不公开。过去我很幸运地检查了 UISplitViewController。

【讨论】:

以上是关于关于 NSClassFromString / 检查手势识别器的困惑的主要内容,如果未能解决你的问题,请参考以下文章

AnyClass 是 NSObjectProtocol... 有时?

Swift 2.1 中的 NSClassFromString

由 NSClassFromString 产生的类与头文件中定义的类不相关

OC中NSClassFromString()与NSStringFromClass()的用法及应用场景

用NSClassFromString得到的class怎么调用那个类的类方法

检查 UIAppearance 的可用性