将存储在内存中的plist读取到NSDictionary

时间:2012-03-07 16:23:25

标签: iphone objective-c ios xcode plist

根据此post,我可以使用加密/解密方法来存储/检索plist文件安全

但问题是:

问:解密plist文件后,如何解析并将plist文件存储为NSDictrionary对象

4 个答案:

答案 0 :(得分:0)

可能NSPropertyListSerialization正是您要找的。

如本帖所示: Plist Array to NSDictionary

答案 1 :(得分:0)

您可以在此处使用核心基础方法CFPropertyListCreateFromXMLData

如果plist表示NSDictionary内容,则应通过以下检查:

if ([(id)plist isKindOfClass:[NSDictionary class]])

并且plist对象可以安全地转换为NSDictionary。如果不是,则数据或解密过程出现问题。

答案 2 :(得分:0)

最简单的方法是为NSDictionary创建一个类别:

<强> NSDictionaryWithData.h:

@interface NSDictionary (NSDictionaryWithData)
+ (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end

<强> NSDictionaryWithData.m:

@implementation NSDictionary (NSDictionaryWithData)

+ (id)dictionaryWithData:(NSData *)data
{
  return [[[NSDictionary alloc] initWithData:data] autorelease];
}

- (id)initWithData:(NSData *)data
{
  self = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:data
                                                          mutabilityOption:NSPropertyListImmutable
                                                                    format:NULL
                                                          errorDescription:nil];
  return [self retain];
}

@end

<强>用法:

NSDictionary* myDict = [[NSDictionary alloc] initWithData:decryptedData];

答案 3 :(得分:0)

dictionaryWithData不存在的一个可能原因是属性列表不一定是根级别的字典。它同样可以是NSArray。

以下是我对解决方案的看法:利用NSPropertyListSerialization

的类别

功能

  • 无声地丢弃包含根级别数组的数据。
  • 检查要使用的方法(propertyListFromData:mutabilityOption:format:errorDescription:is depreciated)

  • 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