NSClassFromString返回nil

时间:2010-02-09 05:54:58

标签: objective-c class instance

为什么NSClassFromString会返回nil?根据定义,它必须返回类名。 我该如何注意纠正这个问题?我需要从string实例化一个类,并使用创建的实例调用类中的方法。

这就是我的代码的样子:

id myclass = [[NSClassFromString(@"Class_from_String") alloc] init];
[myclass method_from_class];

但是method_from_class函数没有被调用,控件不会进入它。我的代码没有错误。知道如何在Objective-C中解决这个问题吗?

7 个答案:

答案 0 :(得分:38)

如果您尝试从静态库实例化一个类,则必须将“-ObjC”标志添加到“Other Linker Flags”构建设置中。

答案 1 :(得分:30)

The Documentation for the function says

  

返回值   由...命名的类对象   aClassName,如果没有类,则为nil   名称当前已加载。如果   aClassName为nil,返回nil。

如何正确使用它的一个例子如下:

Class dictionaryClass = NSClassFromString(@"NSMutableDictionary");
id object = [[dictionaryClass alloc] init];
[object setObject:@"Foo" forKey:@"Bar"];

答案 2 :(得分:4)

如果这是唯一的引用,那么你的类可能没有被链接。

我有一个工厂方法来实例化各种类型的子类。工厂有一个switch语句,转到相应的子类并分配并初始化它。我注意到除了类的名称之外,所有的alloc / init语句完全相同。所以我能够使用NSClassFromString()函数消除整个开关块。

我遇到了同样的问题 - 回报是零。这是因为该类没有在程序的其他地方使用,因此它没有被链接,因此在运行时无法找到它。

您可以通过包含以下声明来解决此问题:

[MyClass class];

这违背了我想要完成的目标,但它可能就是你所需要的一切。

答案 3 :(得分:4)

当我向Xcode项目添加外部文件时,这发生在我身上。将.m文件添加到构建阶段> 编译源解决问题。

答案 4 :(得分:2)

您还需要确保您尝试实例化的类包含在项目中。如果您稍后添加,则需要单击要构建的目标旁边的复选框。

答案 5 :(得分:1)

为什么不分解所有这些电话?这样,您可以检查调用之间的值:

Class myclass = NSClassFromString(@"Class_from_String");
id obj = [[myclass alloc] init];
[obj method_from_class];

顺便问一下,method_from_class是实例方法还是类方法?如果是晚些时候,则可以直接在method_from_class值上调用myclass

[myclass method_from_class];

答案 6 :(得分:0)

我还看到了一个奇怪的地方,添加Apple支持的标准单例代码阻止了类的加载。代码按预期工作,然后我添加了单例,突然NSClassFromString开始返回nil。注释掉单例代码会导致NSClassFromString正确地解析类。我不理解这种交互,但是我认为单例静态var以某种方式被修改以隐藏类名......?