阅读plist存储在内存NSDictionary

问题描述:

根据此post我可以使用加密/解密方法来安全地存储/检索plist文件阅读plist存储在内存NSDictionary

但问题是:

问:我已经解密的plist文件后,我怎么能解析和存储plist文件作为NSDictrionary对象

也许NSPropertyListSerialization是你在找什么。

正如所看到的这个帖子: Plist Array to NSDictionary

+0

文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSPropertyListSerialization_Class /Reference/Reference.html – calimarkus 2012-03-07 16:43:38

你可以在这里使用核心基础的方式与方法CFPropertyListCreateFromXMLData

如果plist中代表的NSDictionary的内容,下面的检查应传递:

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

和plist对象可能会被安全地转换为NSDictionary。如果否,数据或解锁过程出现问题。

最简单的方法将创造像这样的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]; 

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

这里是我对一个解决方案:利用NSPropertyListSerialization

特点

  • 默默丢弃包含阵列在根级别的数据的类别。
  • 检查使用哪种方法(propertyListFromData:mutabilityOption:格式:ERRORDESCRIPTION:折旧)

  • 的NSMutableDictionary也支持

注 - 这需要包装一类工厂方法用的非常规方法一个init方法。这是为了提高效率 - 大多数情况下,您将使用factory方法,它只是包装NSPropertyListSerialization,它在内部调用alloc/init/autorelease返回适当的对象。

NSDictionary + DictionaryWithData。ħ

#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