2018年在Objective-C中将NSDictionary和NSArray读取/写入文件的正确方法是什么?

时间:2018-08-02 16:44:30

标签: objective-c nsarray nsdictionary deprecated

不推荐使用以下class D : public B<D> // <--- B<D> implicitly instantiated here { public: // void f() { std::cout << __PRETTY_FUNCTION__ << std::endl; } }; // <--- D becomes complete here 方法及其等效的NSDictionary与文件交互的方法:

NSArray

[NSDictionary dictionaryWithContentsOfURL:]

[NSDictionary dictionaryWithContentsOfFile:]

[NSDictionary initWithContentsOfFile:]

[NSDictionary writeToFile:atomically:]


我应该用什么来在Objective C中存储字典/数组?

2 个答案:

答案 0 :(得分:2)

从NSDictionary.h中的注释中:

  

这些方法已被弃用,并在后续版本中标记为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。

答案 1 :(得分:1)

虽然不够简洁,但是您可以使用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)