【问题标题】:NSClassFromString returns nilNSClassFromString 返回 nil
【发布时间】:2010-02-09 05:54:57
【问题描述】:

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

这就是我的代码的样子:

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

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

【问题讨论】:

标签: objective-c class instance


【解决方案1】:

如果您尝试从静态库中实例化一个类,您必须将“-ObjC”标志添加到“其他链接器标志”构建设置中。

【讨论】:

  • 将此标志添加到静态库或使用静态库的主程序?
  • 帮我在主程序中设置它。
  • 你太棒了!救了我! :) 非常感谢。
【解决方案2】:

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"];

【讨论】:

  • 但是字符串@"Class_from_String"中的值是类名的值。因为我在从字符串实例化类之前就在上面打印了它。那它怎么会被当作 nil 呢?
  • hey 1've 将第 3 行写为:[object TestMethod]; TestMethod 是同一类中的方法,但控件仍然不是进入方法定义。
  • @suse: 要么你的字符串没有被正确加载,要么运行时没有同名的类, 在这种情况下你必须先加载它。
  • @SpacyRicochet:打开一个新问题,描述为什么你认为你的类应该被加载。然后我们也许可以弄清楚为什么它不起作用。
  • 有趣的是,由于另一个问题,我再次看到了这篇文章。再一次,@GeorgSchölly 的评论有帮助!将-ObjC 添加到链接器标志就可以了。
【解决方案3】:

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

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

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

您可以通过包含以下语句来解决此问题:

[MyClass class];

这违背了我试图完成的全部目的,但它可能就是你所需要的。

【讨论】:

    【解决方案4】:

    当我将一个外部文件添加到 Xcode 项目时,这发生在我身上。将 .m 文件添加到 Build Phases > Compile Sources 解决问题。

    【讨论】:

    • 当我添加 .m 文件但忘记写 @implementation 时,这也发生在我身上
    【解决方案5】:

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

    【讨论】:

    • 这个答案对我有用。我添加了新类,同时选择了不同的目标。我必须选择:Target > Build Phases > Compile Sources > '+' 才能将类 really 添加到项目中。
    【解决方案6】:

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

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

    顺便问一下,method_from_class 是实例方法还是类方法?如果是后者,那么可以直接在myclass值上调用method_from_class

    [myclass method_from_class];
    

    【讨论】:

    • "顺便问一下,method_from_class 是实例方法还是类方法?"好吧,如果不是实例方法,他的代码应该会崩溃。
    【解决方案7】:

    我还看到了一个奇怪的地方,即添加苹果支持的标准单例代码会阻止加载类。代码按预期工作,然后我添加了单例,突然 NSClassFromString 开始返回 nil。注释掉单例代码导致 NSClassFromString 正确解析类。我不明白交互,但我认为单例静态变量不知何故被破坏以隐藏类名......?

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2019-06-20
      • 2017-12-16
      • 2014-09-27
      • 2017-06-11
      相关资源
      最近更新 更多