Одна из возможных причин dictionaryWithData не существует - список свойств не обязательно является словарем на корневом уровне.В равной степени это может быть NSArray.
Вот мое решение: категория, использующая NSPropertyListSerialization
Функции
- Молча отбрасывает данные, содержащие массивы вкорневой уровень.
Проверяет, какой метод использовать (propertyListFromData: mutabilityOption: format: errorDescription: устарел)
NSMutableDictionary также поддерживается
Примечание. Для этого используется неортодоксальный подход - обертывание метода фабрики классов методом init.Это для эффективности - большую часть времени вы будете использовать фабричный метод, который просто оборачивает NSPropertyListSerialization, который внутренне вызывает alloc / init / autorelease для возврата соответствующего объекта.
NSDictionary + DictionaryWithData.h
#import <Foundation/Foundation.h>
@interface NSDictionary (DictionaryWithData)
+ (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end
NSDictionary + DictionaryWithData.m
#import "NSDictionary+DictionaryWithData.h"
@implementation NSDictionary (DictionaryWithData)
+(NSPropertyListMutabilityOptions) mutabilityOption {
return NSPropertyListImmutable;
}
+ (id)dictionaryWithData:(NSData *)data
{
static BOOL methodChecked = NO;
static BOOL use_propertyListWithData = NO;
if (!methodChecked) {
SEL sel = @selector(propertyListWithData:options:format:error:);
use_propertyListWithData = [[NSPropertyListSerialization class]
respondsToSelector:sel];
methodChecked = YES;
}
id result;
if (use_propertyListWithData) {
result = [NSPropertyListSerialization propertyListWithData:data
options:[self mutabilityOption]
format:nil
error:nil];
} else {
result = [NSPropertyListSerialization propertyListFromData:data
mutabilityOption:[self mutabilityOption]
format:NULL
errorDescription:nil];
}
return [result isKindOfClass:[NSDictionary class]] ? result : nil;
}
- (id)initWithData:(NSData *)data
{
id result = [[self class] dictionaryWithData:data];
self = result ? [self initWithDictionary:result ] : nil;
return self;
}
@end
@implementation NSMutableDictionary (DictionaryWithData)
+(NSPropertyListMutabilityOptions) mutabilityOption {
return NSPropertyListMutableContainersAndLeaves;
}
@end