将Array保存到包含自定义对象iPhone的Plist文件

Shr*_*hri 2 iphone cocoa-touch objective-c ios nsdocumentdirectory

我有一个名为XYZ的类继承自NSObject和一个包含XYZ对象的数组.我需要将此数组写入文档目录中的plist文件.在尝试[array writeToFile ....]后,我发现writeToFile失败,因为该数组包含XYZ类的自定义对象.

可能的解决方案是将对象转换为NSData.有什么不同的方法来实现这一目标?我发现NSCoding很合适,但无法理解如何使用它.任何帮助将不胜感激.

Yan*_*iot 9

Ray Wenderlich的博客上有一个非常好的教程,解释了如何使用NSCoding.

只需要在你的对象中实现* - (void)encodeWithCoder:(NSCoder )编码和* - (id)initWithCoder:(NSCoder )解码器方法,就像那样尊重NSCoding协议:

// Header
@interface AnObject: NSObject <NSCoding>

// Implementation
- (void) encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:ivar1 forKey:@"ivar1"];
    [encoder encodeFloat:ivar2 forKey:@"ivar2"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super initWithCoder:coder];
    ivar1 = [[coder decodeObjectForKey:@"ivar1"] retain];
    ivar2 = [[coder decodeObjectForKey:@"ivar2"] retain];
    return self;
}
Run Code Online (Sandbox Code Playgroud)

您也可以在此处查看官方文档.


zap*_*aph 9

实现后encodeWithCoder:,initWithCoder:对于自定义类,这里是如何写和读:

写:

NSError  *error;
NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:yourClassInstance];
[archiveData writeToFile:filePath options:NSDataWritingAtomic error:&error];
Run Code Online (Sandbox Code Playgroud)

读:

NSData *archiveData = [NSData dataWithContentsOfFile:filePath];
YourClass *yourClassInstance = (NSArray*)[NSKeyedUnarchiver unarchiveObjectWithData:archiveData];
Run Code Online (Sandbox Code Playgroud)