代码之家  ›  专栏  ›  技术社区  ›  suse

nsclasfromstring返回nil

  •  18
  • suse  · 技术社区  · 16 年前

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

    我的代码如下所示:

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

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

    7 回复  |  直到 9 年前
        1
  •  30
  •   Dave DeLong    16 年前

    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
  •  37
  •   m.kocikowski    15 年前

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

        3
  •  4
  •   Quang VÄ©nh Hà    9 年前

    当我向Xcode项目添加一个外部文件时,发生了这种情况。将.m文件添加到 建造阶段 gt; 编译源程序 解决问题。

        4
  •  3
  •   Jesus Ramos    13 年前

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

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

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

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

    [MyClass class];
    

    这破坏了我试图达到的目标,但这可能是你所需要的。

        5
  •  2
  •   Boojie Waldron    14 年前

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

        6
  •  1
  •   Laurent Etiemble    16 年前

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

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

    顺便说一下,是 method_from_class 实例方法还是类方法?如果是后者,您可以直接打电话 方法\来自\类 myclass 价值观:

    [myclass method_from_class];
    
        7
  •  0
  •   software evolved    15 年前

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

    推荐文章