如何保存/存档包含自定义对象的NSMutableArray?

时间:2013-02-12 16:01:46

标签: cocoa nsmutablearray nscoder

我有一个NSMutableArray * recordsArray,键是NSStrings,值是自定义对象:

@interface DictRecord : NSObject{
}
@property (nonatomic, retain) NSString* word; 
@property (nonatomic, retain)  NSString  *wordStatus;

Cocoa:如何保存/存档包含自定义对象的NSMutableArray

我想保存那个NSMutable数组,最好是非二进制(稍微可读)格式。

我已经阅读了文档并将编码方法添加到DictRecord:

- (void) encodeWithCoder: (NSCoder *)coder
{
    [coder encodeObject: _word forKey:@"word" ];
    [coder encodeObject: _wordStatus forKey:@"wordStatus" ];
}
- (id) initWithCoder: (NSCoder *) coder
{
    self = [super init];
    if (self) {
        self.word = [coder decodeObjectForKey:@"word"];
        self.wordStatus = [coder decodeObjectForKey:@"wordStatus"];
}

然后我尝试使用以下方式保存:

[recordsArray writeToFile:filePath atomically:YES];

保存文件,但我可以看到它是空的。

任何人都可以告诉我我省略了哪些步骤,或者我是否以错误的方式解决了这个问题。

由于

2 个答案:

答案 0 :(得分:5)

这有点让人困惑,但NSCoding和NSArray以及NSDictionary属性列表方法是两回事。

您有两种选择:

  1. 使用NSCoding。这里是an answer,它显示了如何正确地获取调用数组内容的编码方法。
  2. 使用-[NSArray writeToFile:atomically:]。不要实施-initWithCoder:-decodeWithCoder,而是创建自己的两种方法:-dictionaryValue-initWithDictionary:。要编写,遍历模型对象数组,构建一个新的字典数组,并在其上调用-writeToFile:atomically:。要读取,请调用其中一个NSArray读取方法,获取它包含的字典,并为每个字典调用-initWithDictionary:
  3. 如果你想要一个人类可读的plist,第二个选项是一个不错的选择。

答案 1 :(得分:1)

- [NSArray writeToFile:atomically:]文档状态

  

此方法在写出文件之前以递归方式验证所有包含的对象是属性列表对象,如果所有对象都不是属性列表对象,则返回NO

如果要创建属性列表文件并调用NSCoder内容,则必须使用NSKeyedArchiver / NSKeyedUnarchiver。