-thingWithContentsOfFile:与 NSPropertyListSerialization

-thingWithContentsOfFile: vs. NSPropertyListSerialization

+dictionaryWithContentsOfFile: +arrayWithContentsOfFile:NSPropertyListSerialization(结合 NSDataNSStream)之间是否有任何有意义的区别,假设我知道该文件是特定类型的(例如,我不需要反序列化任意 属性 列表)?

当然,在使用NSPropertyListSerialization之前,我需要先创建一个NSStreamNSData对象,这样收集方法会更简洁一些。但如果有一个更快或更可取,我宁愿使用它。

没有显着差异。 NSPropertyListSerialization 更加可定制。

对于普通的数组或字典,使用没有错...withContentsOf...

这很容易测试。从一个简短的示例程序开始:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSURL *url = ...

        NSDictionary *dict = [NSDictionary dictionaryWithContentsOfURL:url];

        NSLog(@"%@", dict);
    }
    return 0;
}

如我们所料,这将打印 plist 文件的内容。现在,我们在第一行放置一个断点并再次 运行 它。一旦我们得到 lldb 提示,我们输入:

(lldb) breakpoint set -r '.*NSPropertyListSerialization.*'

然后,点击"Continue"继续执行。果然,我们停在了一个断点:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
  * frame #0: 0x00007fff4f22a018 Foundation`+[NSPropertyListSerialization propertyListWithData:options:format:error:]
    frame #1: 0x00007fff4f229bbf Foundation`+[NSDictionary(NSDictionary) newWithContentsOf:immutable:] + 158
    frame #2: 0x00007fff4f242fe9 Foundation`+[NSDictionary(NSDictionary) dictionaryWithContentsOfURL:] + 45
    frame #3: 0x0000000100000e7d MyGreatProject`main(argc=1, argv=0x00007ffeefbff6a0) at main.m:15
    frame #4: 0x00007fff75461015 libdyld.dylib`start + 1

因此,由此,我们可以确定 +dictionaryWithContentsOfURL: 只是调用 NSPropertyListSerialization 来完成它的肮脏工作。因此在实践中,尽管 NSPropertyListSerialization 通过其 options 参数和错误报告提供了更大的灵活性,但可以合理地得出结论,使用哪个并不重要。