我正在开发一个项目,我有各种自定义对象。这些自定义对象(其中一些与嵌套的可变数组一起使用)需要保存到一个或多个文件中。这样做的最佳方法是什么?我应该创建一个负载&保存文件管理器还是让每个对象处理它更好?
感谢您的时间。
- 史蒂文
答案 0 :(得分:1)
为您的班级实施NSCoding
协议:
NSString * const kMyArray = @"myString";
NSString * const kMyBool = @"myBool";
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:_myArray forKey:kMyArray];
[coder encodeBool:_myBool forKey:kMyBool];
//...
}
- (id)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
_myArray = [coder decodeObjectForKey:kMyArray];
_myBool = [coder decodeBoolForKey:kMyBool];
//...
}
return self;
}
允许您使用NSKeyedArchiver
保存和加载数据:
//saving collection of Class<NSCoding> objects
NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
BOOL success = [NSKeyedArchiver archiveRootObject:_collection toFile:path];
//loading
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
if (data) _collection = [NSKeyedUnarchiver unarchiveObjectWithData:data];
答案 1 :(得分:0)
如果您想对对象进行编码和解码,可以查看NSCoding。这是一个直截了当的方法。
查看文档:{{3}} (编辑正确的链接)
我在更新iOS版本时遇到了问题,即存储的对象已损坏。它是从iOS 4.1到iOS 4.2的过渡。
我停止使用NSCoder并切换到创建自定义文件格式,该格式具有基础JSON文件。现在我可以更好地控制文件版本控制,并且可以轻松修复,因为它只是解释您自己的数据文件。
答案 2 :(得分:0)
您可以手动创建一个plist文件(假设 Config.plist 是plist的名称),并在将其复制到Document目录后,您可以通过编程方式对其进行修改。 / p>
所以看看如何将文件复制到文档目录中: 首先定义两个宏:
#define DOCUMENT_DIR [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]
#define PLIST_SETTINGS [DOCUMENT_DIR stringByAppendingPathComponent:@"Config.plist"]
之后 -
NSString *configPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
[self copyIfNeededFrom:configPath To:PLIST_SETTINGS];
NSMutableArray* mArrObjects = [NSMutableArray alloc] initWithObjects:obj1,obj2,obj3, nil];
[mArrObjects writeToFile:PLIST_SETTINGS atomically:YES];
[mArrObjects release];
现在给出 copyIfNeededFrom:to:
的定义- (BOOL)copyIfNeededFrom:(NSString *)sourcePath To:(NSString *)destinationPath
{
NSError *error = noErr;
if(![[NSFileManager defaultManager] fileExistsAtPath:destinationPath])
{
[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destinationPath error:&error];
}
if(noErr)
return YES;
else
return NO;
}
希望它适合你。 干杯!!!