为什么NSClassFromString
会返回nil
?根据定义,它必须返回类名。
我该如何注意纠正这个问题?我需要从string实例化一个类,并使用创建的实例调用类中的方法。
这就是我的代码的样子:
id myclass = [[NSClassFromString(@"Class_from_String") alloc] init];
[myclass method_from_class];
但是method_from_class
函数没有被调用,控件不会进入它。我的代码没有错误。知道如何在Objective-C中解决这个问题吗?
答案 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以某种方式被修改以隐藏类名......?