Можно попробовать схему клавиатуры Emacs ( Инструменты-> Опции-> Среда-> Клавиатура )
Это то, что вы должны сделать:
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver setOutputFormat:NSPropertyListXMLFormat_v1_0];
[archiver encodeObject:artistCollection forKey:@"root"];
[archiver finishEncoding];
[data writeToFile:@"/Users/fgx/Desktop/stuff" atomically:YES];
[archiver release];
Обратите внимание, что вы должны использовать [архиватор encodeObject: artistCollection forKey: @ "root"]
вместо [архиватор encodeRootObject: artistCollection];
как предлагает Шон. Это потому, что NSKeyedArchiver не отменяет NSCoder: метод encodeRootOot сочтем это ошибкой и сообщим об этом в Apple.
Теперь, реальный вопрос: почему вы хотите писать XML вместо двоичного формата по умолчанию? Если это для целей отладки, я предлагаю вам использовать TextWrangler , который позволит вам прозрачно редактировать двоичные файлы plist, как если бы они были XML.
Вам нужно сначала создать экземпляр NSKeyedArchiver вместо использования удобного метода класса, который вернет только NSData.
NSMutableData *data = [NSMutableData new];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// set the one property you specifically wanted
[archiver setOutputFormat:NSPropertyListXMLFormat_v1_0];
// now encode (and finalize) the actual object - note that encodeRootObject: is inherited
// from NSCoder. I assume this works :)
[archiver encodeRootObject:artistCollection];
[archiver finishEncoding];
// now finally write it out - the resulting encoded stuff should be waiting in the data object
[data writeToFile:@"/Users/fgx/Desktop/stuff" atomically:YES];
// cleanup after ourselves
[archiver release];
[data release];
Отказ от ответственности. : Я написал этот код в поле ввода здесь и на самом деле не тестировал его.
«archivedDataWithRootObject:» - это метод класса, а «setOutputFormat» - метод экземпляра. Из документации для 'archivedDataWithRootObject:':
Объект NSData, содержащий закодированную форму графа объектов, корневым объектом которого является rootObject. Формат архива - NSPropertyListBinaryFormat_v1_0.
Что вам нужно сделать, так это создать NSKeyedArchiver и закодировать корневой объект. Также убедитесь, что все содержимое вашей коллекции реализует encodeWithCoder и initWithCoder. Видеть Кодирование и декодирование объектов
Проблема с этим подходом состоит в том, что вам нужно вручную назначать ключи для каждого кодируемого объекта, что не похоже на то, что вы хотите, поскольку у вас уже есть коллекция. И массивы, и словари содержат методы для записи в XML-файл, что является гораздо более простым подходом.
[artistCollection writeToFile:@"/Users/fgx/Desktop/stuff" atomically:YES];
Обсуждение этого метода (как для NSDictionary, так и для NSArray):
Если все содержимое получателя является объектами списка свойств (NSString, NSData, NSArray или NSDictionary), файл, написанный этим методом, можно использовать для инициализации нового массива с помощью метода класса arrayWithContentsOfFile: или метода экземпляра initWithContentsOfFile :. Этот метод рекурсивно проверяет, что все содержащиеся объекты являются объектами списка свойств, перед записью файла и возвращает NO, если все объекты не являются объектами списка свойств, Blockquote
[artistData setOutputFormat: NSPropertyListXMLFormat_v1_0];