在iOS中保存/序列化自定义对象的正确方法

jar*_*ryd 56 iphone ios

我有一个自定义对象,一个UIImageView有几个gestureRecognizer对象的子类.

如果我在a中存储了许多这些对象NSMutableArray,那么如何将这个对象数组保存到磁盘中,以便在用户再次运行应用程序时加载它?

我想从磁盘加载数组并使用对象.

Kos*_*tas 118

我对类似的东西的实现如下并且完美地运行:

自定义对象(设置)应该实现协议NSCoding:

-(void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.difficulty forKey:@"difficulty"];
    [encoder encodeObject:self.language forKey:@"language"];
    [encoder encodeObject:self.category forKey:@"category"];
    [encoder encodeObject:self.playerType forKey:@"playerType"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        self.difficulty = [decoder decodeObjectForKey:@"difficulty"];
        self.language = [decoder decodeObjectForKey:@"language"];
        self.category = [decoder decodeObjectForKey:@"category"];
        self.playerType = [decoder decodeObjectForKey:@"playerType"];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

以下代码将自定义对象写入文件(set.txt),然后将其还原到数组myArray:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"set.txt"];

NSMutableArray *myObject=[NSMutableArray array];
[myObject addObject:self.settings];    

[NSKeyedArchiver archiveRootObject:myObject toFile:appFile]; 

NSMutableArray* myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:appFile]; 
Run Code Online (Sandbox Code Playgroud)

  • 这应该有更多的选票.完整的解决方案,真的帮助了我.谢谢! (4认同)
  • 仅供参考:只要您的自定义对象符合`NSCoding`并实现`initWithCoder:`和`encodeWithCoder:`,您就可以在归档时将其用作根对象.无需像在此代码中那样将它放在`NSMutableArray`中. (4认同)
  • 仅供参考:如果您想了解更多关于NSKeyedArchiver和NSCoding的时间,原因和原因的信息,请查看此http://nshipster.com/nscoding/. (2认同)

aro*_*oth 35

//store the array
[NSKeyedArchiver archiveRootObject:myArray toFile:@"someFile"];

//load the array
NSMutableArray* myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:@"someFile"];
Run Code Online (Sandbox Code Playgroud)

官方参考.

请注意,当数组包含自定义对象类型时,必须确保您的类型符合NSCoding协议,然后才能使用.

  • @Deco - 自定义对象类型必须确认[NSCoding Protocol](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html)上班. (2认同)

Gre*_*reg 6

这篇博客文章解释了如何使用NSKeyedArchiver将一组自定义对象存储到磁盘,并使用NSKeyedUnarchiver 其读回:

http://www.cocoabuilder.com/archive/cocoa/240775-saving-nsarray-of-custom-objects.html

Apple还有一个非常有用的指南,即Archives and Serializations Programming Guide.