用NSClassFromString得到的class怎么调用那个类的类方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用NSClassFromString得到的class怎么调用那个类的类方法相关的知识,希望对你有一定的参考价值。
参考技术A NSClassFromString和NSStringFromClassNSStringFormClass 这个不用说,看命名都应该知道吧。
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()的用法及应用场景