Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Да. Весь код plist является частью CoreFoundation, который является открытым исходным кодом. CoreFoundation может непосредственно создаваться и работаться Linux и Windows, таким образом, можно записать инструмент CF с помощью нормальных API, Вы использовали бы на Mac OS X, но сборке и выполнили бы его на других платформах.
конкретный API, на который Вы хотите посмотреть, CFPropertyListWriteToStream () . Код для CoreFoundation доступен от Apple ( tarball) среди других мест.
Наконец в зависимости от того, как часто Вы обновляете файл, сколько процессора необходимо сэкономить на сервере, и сколько повторения там является данными, может быть одно значительное улучшение, оставленное это, можно сделать. Определенными элементами по умолчанию в двоичном файле plists являются uniqued (таким как строки). Другие элементы не (такие как массивы и dictionarts). Двоичный файл plist формат позволяет им быть uniqued, проблема - то, что дорого на самом деле идти через и уникальные массивы и словари. Если у Вас есть много идентичных массивов или dicts в Вашем содержании, можно видеть значительное сокращение размера uniquing их. Можно включить это, изрубив _flattenPlist () в CFBinaryPlist.c.
, Если Вы делаете, которые удостоверяются, что протестировали его очень полностью, и не делают ни на каких файлах, которые Вы не можете обновить по сети, на всякий случай будущий выпуск делает любую оптимизацию тем повреждением это. Кроме того, удостоверьтесь, что Вы готовы выключить его в уведомлении моментов.
Не ясно, хотите ли Вы сделать преобразование на iPhone или на сервере. Если это находится на сервере, и можно использовать платформы Какао, эти NSPropertyListSerialization
предоставляет услуги для преобразования между поддерживаемыми типами plist (строка, XML и двоичный файл) на OS X (начиная с 10.2). Существуют также аналогичные методы в библиотеке Core Foundation, если Вы предпочли бы использовать это вместо этого.
Для преобразования XML plist в двоичную единицу:
NSString *xmlPlistPath; // already set
NSString *outPath; // already set
NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;
plistData = [NSData dataWithContentsOfFile:xmlPlistPath];
plist = [NSPropertyListSerialization propertyListFromData:plistData
mutabilityOption:NSPropertyListImmutable
format:&format
errorDescription:&error];
if(plist == nil) { // unable to parse plist
//deal with failure -- error gives description of the error
} else {
binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist
format:NSPropertyListBinaryFormat_v1_0
errorDescription:&error];
if(binaryPlistData == nil) {//unable to create serialized plist
// deal with failure -- error gives description of the error
}
if(![binaryPlistData writeToFile:outPath atomically:YES]) {
// unable to write file
}
}
См. страница Property List Pramming Guide на developer.apple.com для получения дополнительной информации.
Связанная реализация Ruby - это только Ruby 1.9. Я сделал быстрый двоичный сериализатор, который работает в Ruby 1.8.
Существует также реализация Perl под названием Data :: Plist