Кодирование и декодирование GameState Class Issue

0

У меня есть класс с именем 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 sharedInstance] в HeroState.o "saveData (objc_object *, NSString *)", на который ссылаются: - [Сохранение Героев) в HeroState.o ld: символ не найден для архитектуры i386 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть вызов)

У меня есть функция initWithCoder и функция encodeWithCoder, которые придерживаются протоколов NSCoding. Так что может быть неправильно? Раньше у меня был этот класс как унаследованный класс NSObject, и у меня не было никаких проблем, но когда я решил воссоздать его, это было наследование моего класса CharacterProperties, которое было наследованием проблем NSObject.

Буду признателен за любую помощь!

Теги:
iphone
cocos2d-iphone

1 ответ

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. Нет причин не в этот день и в возрасте.

  • 0
    Я думал об этом, но никогда не думал, что это станет причиной этой проблемы. Изменил класс моей базы данных на класс C, и он был создан без проблем, спасибо Штеффен. О PS: я начну использовать ARC, спасибо за примечание.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню