NSClassFromString返回nil

sus*_*use 18 class objective-c instance

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

这是我的代码的样子:

id myclass = [[NSClassFromString(@"Class_from_String") alloc] init];
[myclass method_from_class];
Run Code Online (Sandbox Code Playgroud)

但是这个method_from_class功能没有被调用,控制也没有进入.我的代码没有错误.知道如何在Objective-C中解决这个问题吗?

m.k*_*ski 38

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

  • 为我工作在主程序中设置它. (3认同)

Dav*_*ong 30

该功能的文档说:

返回值 由aClassName命名的类对象,如果当前未加载该名称的类,则返回 nil.如果aClassName为nil,则返回nil.

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

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

  • @suse:你的字符串没有正确加载,或者没有运行时已知的那个名称的类,_在这种情况下你必须先加载它. (6认同)
  • 有趣的是,由于另一个问题,我再次发现这篇文章.再次,@GeorgSchölly的评论有帮助!添加`-ObjC`到链接器标志就可以了. (2认同)

小智 5

如果这是对您的类的唯一引用,则您的类可能不会被链接。

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

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

您可以通过添加以下语句来解决此问题:

[MyClass class];
Run Code Online (Sandbox Code Playgroud)

这违背了我想要实现的全部目的,但这可能就是你所需要的。