2

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

@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];

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

谁能告诉我我省略了哪些步骤,或者我是否走错了路。

谢谢

4

2 回答 2

5

这有点令人困惑,但是 NSCoding 和 NSArray 和 NSDictionary 属性列表方法是两个独立的东西。

你有两个选择:

  1. 使用 NSCoding。这是一个答案,它显示了如何正确获取对数组内容调用的编码方法。
  2. 使用-[NSArray writeToFile:atomically:]. 与其实现-initWithCoder:and -decodeWithCoder,不如创建自己的两个方法:-dictionaryValueand -initWithDictionary:。要编写,遍历模型对象数组,构建一个新的字典数组,然后调用-writeToFile:atomically:它。要读取,调用 NSArray 读取方法之一,获取其中包含的字典,然后调用-initWithDictionary:每个字典。

如果你想要一个人类可读的 plist,第二个选项是一个不错的选择。

于 2013-02-12T16:14:53.647 回答
1

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

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

If you want to create a property list file and have the NSCoder stuff get called, you have to use NSKeyedArchiver/NSKeyedUnarchiver.

于 2013-02-12T16:15:50.200 回答