在 iOS 中保存 NSMutableArray
Posted
技术标签:
【中文标题】在 iOS 中保存 NSMutableArray【英文标题】:Save NSMutableArray in iOS 【发布时间】:2016-02-02 18:46:40 【问题描述】:我需要用我的自定义对象保存许多 NSMutableArray,我想知道执行此操作的最佳方法是什么。
也许 NSUserDefaults 不是最好的方法。
我应该使用什么?
【问题讨论】:
【参考方案1】:如果您的数组包含 非 plist 对象,then you cannot use NSUserDefaults
without first encoding the array.
value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。
您需要对其进行编码 using NSKeyedArchiver
。 这将为您提供一个 NSData
对象,然后您可以将其存储在 NSUserDefaults
中,或者通过 NSKeyedArchiver
本身将其写入文件.
您所要做的就是在您的自定义对象中符合NSCoding
,并在加载时覆盖initWithCoder:
来初始化您的对象,并在编码时覆盖encodeWithCoder:
来编码您的变量。例如,您的自定义对象将如下所示:
@interface customArrayObject : NSObject <NSCoding>
@property (nonatomic) NSString* foo;
@property (nonatomic) NSInteger bar;
@end
@implementation customArrayObject
-(instancetype) initWithCoder:(NSCoder *)aDecoder // decode variables
if (self = [super init])
_foo = [aDecoder decodeObjectForKey:@"foo"];
_bar = [aDecoder decodeIntegerForKey:@"bar"];
return self;
-(void) encodeWithCoder:(NSCoder *)aCoder // encode variables
[aCoder encodeObject:_foo forKey:@"foo"];
[aCoder encodeInteger:_bar forKey:@"bar"];
@end
还值得注意的是,NSUserDefaults
用于存储用户首选项,因此如果您的数组包含与用户偏好,您不应该使用NSUserDefaults
- 您应该自己将其写入磁盘。
将阵列写入磁盘实际上比听起来要简单得多,您可以在NSKeyedArchiver
上使用archiveRootObject:toFile:
方法。例如,这会将您的自定义数组写入文档目录:
// Gets the documents directory path
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES)[0];
// Archive and save the file to foo.dat in the documents directory. Returns whether the operation was successful.
BOOL success = [NSKeyedArchiver archiveRootObject:customArray toFile:[NSString stringWithFormat:@"%@/%@", documentsPath, @"foo.dat"]]
不过,同样值得注意的是,这个关于操作是否成功的平面(是/否)在错误处理方面并没有那么好。如果你想实现自定义错误处理,那么您需要先使用NSKeyedArchiver
的archivedDataWithRootObject:
方法对对象进行编码,然后再使用NSData
的writeToFile:options:error:
方法对对象进行编码。
【讨论】:
NSKeyedArchiver
有一种直接归档到文件的方法,因此您不妨使用它,而不是将其转换为数据,然后在单独的调用中写入文件。
确实如此!以前从未见过...我会在几秒钟内更新我的答案。虽然,我个人还是更喜欢使用NSData
方法,因为它有更多的错误处理空间。 NSKeyedArchiver
只是返回一个是或否来表示它是否有效。
没错,虽然writeToFile:atomically
也只返回是/否。如果您需要更具体的错误信息,请使用 writeToFile:options:error:
。
@dan 是的,为了简单起见,我只是在答案中使用它;)
自动处理的对象不是“非自定义”,而是称为plist(对象)。有大量 Apple 制作的课程无法由 NSUserDefault
处理。 (原因是,用户默认的文件表示是一个 XML plist。)以上是关于在 iOS 中保存 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章