0

您好,我正在制作 cocos2d 侧滚动条。我正在使用 plist 文件来提供我的游戏数据。由于某种原因,代码没有读取 plist 文件,当我想显示图像时,图像在 plist 文件中,然后出现 SIGABRT 错误。

这是 plist 文件:在此处输入图像描述

这是导致错误的代码:

+(id)createRedEnemyWithDictionary:(NSDictionary *)redEnemyDictionary{
return [[[self alloc]initWithDictionary:(NSDictionary*)redEnemyDictionary]autorelease];
}

-(id)initWithDictionary:(NSDictionary*)redEnemyDictionary{
if ((self = [super init])) {
    //Make the redEnemy
    redEnemySprite = [CCSprite spriteWithFile:[redEnemyDictionary    objectForKey:@"RedEnemyBaseImage"]];
    [self addChild:redEnemySprite];

这是我得到的错误:

*** -[CCSprite initWithFile:] 中的断言失败

这是我的异常断点指向的代码行:

NSAssert(filename != nil, @"Invalid filename for sprite");
4

1 回答 1

0

通过优化代码的可读性(这也意味着“可记录性”)让您的生活更轻松。而不是这个:

redEnemySprite = [CCSprite spriteWithFile:
    [redEnemyDictionary objectForKey:@"RedEnemyBaseImage"]];

改写如下:

NSString* img = [redEnemyDictionary objectForKey:@"RedEnemyBaseImage"];
NSLog(@"using image file: %@", img);
redEnemySprite = [CCSprite spriteWithFile:img];

额外的临时变量img允许您在img设置调试断点时检查变量的内容,巧合的是您还可以记录它。

如果您记录 nil,请通过记录来检查字典:

NSLog(@"dict: %@", redEnemyDictionary);

嵌套字典结构中的一个常见错误是忘记在字典中索引子路径。即上面的 plist 是一个包含键“Characters”的字典,它是另一个字典,其“RedEnemy”键包含另一个带有字符串的字典。如果您只忘记了其中一个键或打错了字,则返回的对象将为 nil,所有后续访问“nil 对象”字典的操作也是如此。

如果您知道如何设置断点、单步执行代码和检查调试器中的变量,那么这些东西很容易调试。如果您不熟悉这些过程,您应该阅读Xcode 调试指南

于 2013-08-26T11:06:21.303 回答