我正在尝试为iPhone和iPad编写风险应用游戏。 在这一刻,我只开发了三个类: 国家大陆和装载机。 国家有一个名称,一个归属大陆和一组近国家。 然后,大陆有一个名称,以及一组属于它的国家。 Loader创建Country和Continents的实例并将它们链接在一起。 因此,每个国家只有一个实例,每个大陆只有一个实例。 我进行dataStructure共享以节省内存,因为它有意义。 问题是我创建所有国家和大陆的方法不是那么优雅(它是160行代码)所以我想将这些结构保存在文件中并在需要时加载它们。 我为我的“自定义”类实现了NSCoding协议:
//Country.m
- (void) encodeWithCoder:(NSCoder*) coder
{
[coder encodeObject:name forKey:@"name"];//name is of type NSString*
[coder encodeObject:continent forKey:@"continent"];//name is of type NSSet*
[coder encodeObject:nearCountries forKey:@"nearCountries"];//name is of type NSSet*
}
- (id) initWithCoder:(NSCoder*) coder {
[self initWithName:[coder decodeObjectForKey:@"name"]];
continent = [coder decodeObjectForKey:@"continent"];
nearCountries = [coder decodeObjectForKey:@"nearCountries"];
return self;
}
//Continent.h
- (void) encodeWithCoder:(NSCoder*) coder
{
[coder encodeObject:name forKey:@"name"];
[coder encodeObject:countries forKey:@"countries"];
}
- (id) initWithCoder:(NSCoder*) coder
{
[self initWithName:[coder decodeObjectForKey:@"name"]];
countries = [coder decodeObjectForKey:@"countries"];
return self;
}
然后我创建了一组国家和一组大陆,并使用此方法将它们保存到文件中:
-(void) writeToFile:(NSString*) pathCountry:(NSString*) pathContinent{
[NSKeyedArchiver archiveRootObject: countries toFile:pathCountry];
[NSKeyedArchiver archiveRootObject: continents toFile:pathContinent];
}
问题在于,当我尝试运行程序时,从文件中加载它们:
-(id) initWithFiles:(NSString*)pathCountries :(NSString*)pathContinents{
[super init];
continents = [NSKeyedUnarchiver unarchiveObjectWithFile:pathContinents];
countries = [NSKeyedUnarchiver unarchiveObjectWithFile:pathCountries];
return self;
}
我得到了所有这些,但没有保存“内部”设置... 所以我可以访问一个国家的名称,但不能访问一个国家的近国,我不明白为什么它不起作用! 他们为什么不编码?它们是由Country构成的NSSet的实例,并且都实现了NSCoding ...... 感谢您的耐心等待!