为什么NSClassFromString在这两种情况下返回nil?

时间:2013-05-10 13:14:56

标签: objective-c cocoa

我正在使用CocosBuilder 2.1和Cocos2d-iPhone 2.0。我已经让CocosBuilder进行编译了,在我的项目中使用他们的单文本标签示例时,我遇到了一个奇怪的问题。

以下是有问题的代码,来自CCBReader.m第823行:

Class class = NSClassFromString(className);
if (!class)
{
    NSLog(@"CCBReader: Could not create class of type %@",className);
    return NULL;
}

此操作失败,文本“无法创建CCLabelTTF类型的类”。但是,如果我改变这样的代码:

Class class = NSClassFromString(className);
if (!class)
{
    CCLabelTTF* tempLabel = [[CCLabelTTF alloc] init];
    [tempLabel release];
    NSLog(@"CCBReader: Could not create class of type %@",className);
    return NULL;
}

有效。我没有看到其他人在这个地方遇到过CocosBuilder的问题,所以发生了什么?

奇怪的是,这种变化只能在编译器级别影响它,因为添加的代码在错误段内,对吗?

2 个答案:

答案 0 :(得分:3)

因为您在项目中根本没有使用CCLabelTTF,所以运行时没有为您加载该类。

它在您执行hack后工作,因为您的项目现在使用CCLabelTTF类,因此运行时将加载它。

要解决此问题,请将-ObjC添加到链接器标志,检查以下链接中的详细信息

http://developer.apple.com/library/mac/#qa/qa1490/_index.html https://stackoverflow.com/a/2615407/642626

答案 1 :(得分:0)

来自apple documentation

  

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

您的变量“className”为nil,或者在此调用之前未在运行时加载类。 尝试使用以下方法强制加载此类:

[CCLabelTTF class];

代码中的任何地方。

将来:尝试在创建新版本之前搜索your question

相关问题