在 2018 年将 NSDictionary 和 NSArray 读/写到 Objective-C 中的文件的正确方法是啥?
Posted
技术标签:
【中文标题】在 2018 年将 NSDictionary 和 NSArray 读/写到 Objective-C 中的文件的正确方法是啥?【英文标题】:What is the proper way of reading/writing NSDictionary and NSArray to a file in Objective-C in 2018?在 2018 年将 NSDictionary 和 NSArray 读/写到 Objective-C 中的文件的正确方法是什么? 【发布时间】:2018-08-02 16:44:30 【问题描述】:不推荐使用以下用于与文件交互的 NSDictionary
方法及其等效的 NSArray
方法:
[NSDictionary dictionaryWithContentsOfURL:]
[NSDictionary dictionaryWithContentsOfFile:]
[NSDictionary initWithContentsOfFile:]
还有
[NSDictionary writeToFile:atomically:]
[NSDictionary writeToURL:atomically:]
我应该用什么来代替在 Objective C 中存储字典/数组?
【问题讨论】:
【参考方案1】:来自 NSDictionary.h 中的 cmets:
这些方法已弃用,并将在后续版本中标记为 API_DEPRECATED。请改用使用错误的变体。
使用错误的变体是
- (nullable NSDictionary<NSString *, ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error;
+ (nullable NSDictionary<NSString *, ObjectType> *)dictionaryWithContentsOfURL:(NSURL *)url error:(NSError **)error;
和
- (BOOL)writeToURL:(NSURL *)url error:(NSError **)error;
将此实例序列化为 NSPropertyList 格式的指定 URL(使用 NSPropertyListXMLFormat_v1_0)。对于其他格式,直接使用 NSPropertyListSerialization。
【讨论】:
很遗憾,这些方法仅适用于 macOS 10.13+【参考方案2】:它不是很简洁,但是你可以使用 NSPropertyListSerialization 上的类方法在 plist 对象(包括 NSArray 和 NSDictionary)和 NSData 之间进行转换,然后使用 NSData 上的 API 来读取和写入文件。
例如,从文件中读取可能如下所示:
NSData *fileData = [NSData dataWithContentsOfFile:@"foo"];
NSError *error = nil;
NSDictionary *dict = [NSPropertyListSerialization propertyListWithData:fileData options:NSPropertyListImmutable format:NULL error:&error];
NSAssert([dict isKindOfClass:[NSDictionary class]], @"Should have read a dictionary object");
NSAssert(error == nil, @"Should not have encountered an error");
同样,写入文件也是类似的,但两个步骤相反:
NSError *error;
NSData *data = [NSPropertyListSerialization dataWithPropertyList:dict format:NSPropertyListXMLFormat_v1_0 options:0 error:&error];
NSAssert(error == nil, @"Should not have encountered an error");
[data writeToFile:@"foo" atomically:YES];
虽然这需要更多的击键来编写,但它......
更能表达实际发生的过程(转换,然后是文件 I/O) 更清楚地了解文件foo
(XML v1.0 格式的属性列表数据)中的实际内容
在调试时更有帮助(error
指针给出了失败的原因;NSData 将它们用于 I/O 以及其他更详细的方法)
【讨论】:
此解决方案的另一个优点是它使用自 OSX 10.6 以来可用的方法。 +1以上是关于在 2018 年将 NSDictionary 和 NSArray 读/写到 Objective-C 中的文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章