在 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 中的文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

2018年将成数据年?Oracle宣布收购DataScience

带节奏!曝苹果2018年将下调iPhone售价!

云中间件工具崛起,2018年将成云中间件之年?

PONY.AI彭军:2018年将是自动驾驶商业化的元年

模块化机架式UPS市场潜力大,2018年将迎来大爆发?

自然语言处理的下一个十年将在哪里?CCF-GAIR 2018将给你答案