2013-10-26 56 views
0

我有一个名为HeroState的类,它是从名为CharacterProperties的另一个类的继承,它包含armorId,headId,earsId和一些其他创建字符的常见值。在这个我已经在头上宣布的新班级中。 (它负责的球员进步的阶级,通过说这是一个单身)编码和解码GameState类问题

@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"); 
} 

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

Undefined symbols for architecture i386: "loadData(NSString*)", referenced from: +[HeroState sharedInstance] in HeroState.o "saveData(objc_object*, NSString*)", referenced from: -[HeroState save] in HeroState.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

我有一个的initWithCoder功能和encodeWithCoder功能坚守NSCoding的协议。那么有什么可能是错的?我将这个类作为一个NSObject inhertied类,并且对它没有任何问题,但是当我决定重新创建它时,我的CharacterProperties类的继承是NSObject继承的问题。

我会很感激任何类型的帮助!

回答

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类,它没有建立问题,谢谢Steffen。关于PS:我将开始使用ARC,谢谢你的提示。 –