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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用NSClassFromString得到的class怎么调用那个类的类方法相关的知识,希望对你有一定的参考价值。

参考技术A NSClassFromString和NSStringFromClass
  NSStringFormClass 这个不用说,看命名都应该知道吧。
  NSClassFromString 将NSString转换成一个Class,如果不存在,返回一个nil。
  正常来说,
  id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
  和
  id myObj = [[MySpecialClass alloc] init];
  是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
  因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
  比如在iPhone中,NSTask可能就会出现这种情况,所以在你需要使用NSTask时,最好使用:
  [[NSClassFromString(@"NSTask") .....]]
  而不要直接使用[NSTask ...]这种写法。
  NSClassFromString的好处是:
  1 弱化连接,因此并不会把没有的Framework也link到程序中。
  2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。
  同样的,还可以通过一个方法名字来得到一个Selector,然后就可以动态的调用这个Selector了,在Obj-c里面,一切都是动态的。
  类似的函数如下:
NSClassFromString
NSGetSizeAndAlignment
NSLog
NSLogv
NSSelectorFromString
NSStringFromClass
NSStringFromSelector

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

【中文标题】关于 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得到的class怎么调用那个类的类方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 NSClassFromString 代码转换为 Swift?

Swift 2.1 中的 NSClassFromString

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

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

根据字符串生成类---类的类型.self---根据字符串创建控制器对象

Google Clas-s-room APIS:阅读课程中的公告、问题和作业