-thingWithContentsOfFile: vs. NSPropertyListSerialization - PullRequest
0 голосов
/ 25 апреля 2018

Есть ли существенная разница между +dictionaryWithContentsOfFile: +arrayWithContentsOfFile: и NSPropertyListSerialization (в сочетании с NSData или NSStream), если предположить, что я знаю, что файл имеет определенный тип (например, мне не нужно десериализовать произвольный список свойств)?

Конечно, мне нужно создать объект NSStream или NSData, прежде чем использовать NSPropertyListSerialization, поэтому методы сбора данных будут более краткими. Но если кто-то быстрее или предпочтительнее, я бы лучше использовал это.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Это достаточно легко проверить.Начните с короткого примера программы:

#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.*'

Затем нажимаем «Продолжить», чтобы возобновить выполнение.Конечно же, мы остановимся на точке останова:

(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 и отчетам об ошибках.

0 голосов
/ 25 апреля 2018

Нет существенной разницы.NSPropertyListSerialization просто более настраиваемый.

Для обычного массива или словаря нет ничего плохого в использовании ...withContentsOf...

...