2012-03-07 65 views
0

根據此post我可以使用加密/解密方法來安全地存儲/檢索plist文件閱讀plist存儲在內存NSDictionary

但問題是:

問:我已經解密的plist文件後,我怎麼能解析和存儲plist文件作爲NSDictrionary對象

回答

0

也許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

0

你可以在這裏使用核心基礎的方式與方法CFPropertyListCreateFromXMLData

如果plist中代表的NSDictionary的內容,下面的檢查應傳遞:

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

和plist對象可能會被安全地轉換爲NSDictionary。如果否,數據或解鎖過程出現問題。

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]; 
0

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