-thingWithContentsOfFile:与NSPropertyListSerialization相对

时间:2018-04-25 19:22:01

标签: ios objective-c foundation

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

当然,在使用NSStream之前,我需要创建一个NSDataNSPropertyListSerialization对象,因此收集方法更简洁一些。但如果一个人更快或更好,我宁愿使用它。

2 个答案:

答案 0 :(得分:2)

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

Sub NoSpaces()
    Dim c As Range
    For Each c In Selection.Cells
        c.Value = Replace(c.Value, Chr(160), Chr(32))
    Next
End Sub

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

#import <Foundation/Foundation.h>

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

        NSDictionary *dict = [NSDictionary dictionaryWithContentsOfURL:url];

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

然后,单击“继续”以继续执行。果然,我们停在断点处:

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

因此,我们可以确定(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参数和错误报告提供了更大的灵活性,但可以合理地得出结论:使用哪个并不重要。

答案 1 :(得分:0)

没有显着差异。 NSPropertyListSerialization可以更加自定义。

对于普通数组或字典,使用...withContentsOf...

没有错