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

Posted

技术标签:

【中文标题】由 NSClassFromString 产生的类与头文件中定义的类不相关【英文标题】:Class resulted from NSClassFromString does not associate with class defined in header file 【发布时间】:2011-11-28 03:31:07 【问题描述】:

在下面的代码中,我使用 NSClassFromString 将 NSString "ColorFilter" 转换为类名 ColorFilter。结果 ColorFilter 类似乎与我在 import 语句中的头文件中定义的同名类没有关联。

在我的 .h 文件中:

#import "ColorFilter.h"   //ColorFilter is a subclass of UIViewController which also has an iVars name imageView of UIImageView class

在我的 .m 文件中:

NSString *filter = @"ColorFilter";
UIViewController *myFilterClass = [[NSClassFromString(filter) alloc] initWithNibName:filter bundle:nil];

我从上面一行得到的错误是 [ColorFilter initWithNibName:bundle:]: unrecognized selector sent to instance...

为了测试,我将最后一行修改为:

UIViewController *myFilterClass = [[NSClassFromString(filter) alloc] init];
myFilterClass.imageView = .....;

现在我得到的错误是 -[ColorFilter setImageView:]: unrecognized selector sent to instance...

我的结论是,由 NSClassFromString 生成的 ColorFilter 类对这个 #import "ColorFilter.h" 一无所知。

知道我的错误是什么吗?

【问题讨论】:

【参考方案1】:

ColorFilter.m 可能不会与您的应用一起编译。在项目的构建源选项卡中,在编译源下,您是否看到“ColorFilter.m”?如果没有,请将其拖到该列表中。

【讨论】:

它就在那里。此外,如果我在实例化语句中将 NSClassFromString(filter) 替换为 ColorFilter 。一切都按预期工作。 在颜色过滤器对象上调用 classname 以查看应用程序的名称是什么 请看我对这篇文章的回答。【参考方案2】:

我发现我的一个静态库已经定义了“ColorFilter”类。

看起来在编译时,可以覆盖静态库中的现有类。但在运行时,静态库中的类优先于动态生成的类。

【讨论】:

以上是关于由 NSClassFromString 产生的类与头文件中定义的类不相关的主要内容,如果未能解决你的问题,请参考以下文章

abstract class与 interfacer

Java中动态代理技术生成的类与原始类的区别 (good)

类与继承

类与对象的使用

Python新式类与经典类的区别

8.python之面相对象part.1(初识类与对象)