编码和解码GameState类问题

时间:2013-10-26 18:02:06

标签: c++ ios iphone objective-c cocos2d-iphone

我有一个名为HeroState的类,它是另一个名为CharacterProperties的类的继承,它包含armorId,headId,earsId和一些其他常用值来创建一个字符。在这个新类我已经在标题上声明了。 (这是负责球员进步的班级,说它是单身人士)

    @interface HeroState : CharacterProperties <NSCoding>  {
    ControlsType controlsType;
    characterJob charJob;
    MonsterJob monsterJob;
    } 


@property MonsterJob monsterJob;
@property characterJob charJob;
@property (readwrite)ControlsType controlsType;

+ (HeroState *) sharedInstance;
- (void)save;

@end

我有一个“数据库”类负责保存和加载课程。

数据库标题:

#import <Foundation/Foundation.h>

id loadData(NSString * filename);
void saveData(id theData, NSString *filename);

数据库实施:

NSString * pathForFile(NSString *filename) {
    // 1
    NSArray *paths =
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                        NSUserDomainMask,
                                        YES);
    // 2
    NSString *documentsDirectory = [paths objectAtIndex:0];
    // 3
    return [documentsDirectory
            stringByAppendingPathComponent:filename];
}

id loadData(NSString * filename) {
    // 4
    NSString *filePath = pathForFile(filename);
    // 5
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        // 6
        NSData *data = [[[NSData alloc]
                         initWithContentsOfFile:filePath] autorelease];
        // 7
        NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc]
                                          initForReadingWithData:data] autorelease];
        // 8
        id retval = [unarchiver decodeObjectForKey:@"Data"];
        [unarchiver finishDecoding];
        return retval;
    }
    return nil;
}

void saveData(id theData, NSString *filename) {
    // 9
    NSMutableData *data = [[[NSMutableData alloc] init] autorelease];
    // 10
    NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc]
                                  initForWritingWithMutableData:data] autorelease];
    // 11
    [archiver encodeObject:theData forKey:@"Data"];
    [archiver finishEncoding];
    // 12
    [data writeToFile:pathForFile(filename) atomically:YES];
}

但是当我在HeroClass上使用它时

+(HeroState*)sharedInstance {
    @synchronized([HeroState class])
    {
        if(!sharedInstance) {
            sharedInstance = [loadData(@"HeroState") retain];
            if (!sharedInstance) {
                [[self alloc] initWithNewStats];
            }
        }
        return sharedInstance;
    }
    return nil;
}

这里是为了保存

- (void)save {
    saveData(self, @"HeroState");
}

当我尝试构建它时,它给了我一个错误:

  

架构i386的未定义符号:     “loadData(NSString *)”,引自:         HeroState.o中的+ [HeroState sharedInstance]     “saveData(objc_object *,NSString *)”,引自:          - HeroState.o中的[HeroState save]   ld:找不到架构i386的符号   clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

我有一个initWithCoder函数和一个遵循NSCoding协议的encodeWithCoder函数。那可能是什么错?我以前把这个类作为一个NSObject inhertied类,对它没有任何问题,但是当我决定重新创建它时,我的CharacterProperties类继承了NSObject的继承问题。

我将感激任何类型的帮助!

1 个答案:

答案 0 :(得分:0)

您确定要将这些声明为C函数吗?

NSString * pathForFile(NSString *filename) {..}
id loadData(NSString * filename) {..}
void saveData(id theData, NSString *filename)  {..}

也许您应该将它们声明为静态类函数。

+(id) loadData:(NSString *)filename {..}
// similar for the other C functions

并相应地调用它:

sharedInstance = [[HeroState loadData:@"HeroState"] retain];

PS:请开始使用ARC。在这个时代没有理由不去。