+dictionaryWithContentsOfFile:
+arrayWithContentsOfFile:
与NSPropertyListSerialization
(结合NSData
或NSStream
)之间是否存在任何有意义的差异,假设我知道该文件属于特定类型(例如,我不需要反序列化任意属性列表)?
当然,在使用NSStream
之前,我需要创建一个NSData
或NSPropertyListSerialization
对象,因此收集方法更简洁一些。但如果一个人更快或更好,我宁愿使用它。
答案 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...