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

Cocoa 如何保存/归档包含自定义对象的NSMutableArray?,cocoa,nsmutablearray,nscoder,Cocoa,Nsmutablearray,Nscoder,我有一个NSMutableArray*recordsArray,键是NSString,值是自定义对象: @interface DictRecord : NSObject{ } @property (nonatomic, retain) NSString* word; @property (nonatomic, retain) NSString *wordStatus; Cocoa:如何保存/归档包含自定义对象的NSMutableArray 我想保存NSMutable数组,最好是非二进制(

我有一个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];
保存了一个文件,但我可以看到它是空的

有谁能告诉我我遗漏了哪些步骤,或者我是否走错了方向


谢谢

这有点让人困惑,但是NSCoding和NSArray和NSDictionary属性列表方法是两件不同的事情

你有两个选择:

  • 使用NSCoding。下面展示了如何正确获取对数组内容调用的编码方法
  • 使用
    -[NSArray writeToFile:atomically:
    。不要实现
    -initWithCoder:
    -decodWithCoder
    ,而是创建两种自己的方法:
    -dictionaryValue
    -initWithDictionary:
    。要编写,请遍历模型对象数组,构建一个新的字典数组,并在此基础上调用
    -writeToFile:atomicaly:
    。要读取,请调用其中一个NSArray读取方法,获取其中包含的字典,并对每个字典调用
    -initWithDictionary:

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

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

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


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

    NSPropertyListSerialization不是一个选项吗?谢谢Ken,使用[NSArray writeToFile:ATOMICALY:],但没有使用NSCoder。谢谢noa,使用了第二种方法并使其正常工作。如果我理解正确的话,这是一个以property list compkliant格式完全重新构建数据结构的案例。不过,我没有使用任何字典,因为为3个NSStrings([0]=key[1]=word[2]=wordstatus)的每条记录创建一个NSArray似乎更容易,然后保存这些数组的数组。它正在保存和加载,并且是人类可读的:)使用字典会有好处吗?是的:随着模式的改变,新的和旧的数据文件仍然有意义。如果在初始值设定项中提供默认值,则缺少的值可以继承默认值。