У меня есть класс с именем 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.
Буду признателен за любую помощь!
Вы уверены, что хотите объявить их как функции 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. Нет причин не в этот день и в возрасте.