编码和解码 - 自定义对象和实现

时间:2012-10-26 08:23:08

标签: objective-c

我正在开发一个项目,我有各种自定义对象。这些自定义对象(其中一些与嵌套的可变数组一起使用)需要保存到一个或多个文件中。这样做的最佳方法是什么?我应该创建一个负载&保存文件管理器还是让每个对象处理它更好?

感谢您的时间。

- 史蒂文

3 个答案:

答案 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;
}

希望它适合你。 干杯!!!