我有一个名为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的继承问题。
我将感激任何类型的帮助!
答案 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。在这个时代没有理由不去。