根據此post我可以使用加密/解密方法來安全地存儲/檢索plist文件。閱讀plist存儲在內存NSDictionary
但問題是:
問:我已經解密的plist文件後,我怎麼能解析和存儲plist文件作爲NSDictrionary對象
根據此post我可以使用加密/解密方法來安全地存儲/檢索plist文件。閱讀plist存儲在內存NSDictionary
但問題是:
問:我已經解密的plist文件後,我怎麼能解析和存儲plist文件作爲NSDictrionary對象
也許NSPropertyListSerialization
是你在找什麼。
正如所看到的這個帖子: Plist Array to NSDictionary
你可以在這裏使用核心基礎的方式與方法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
文檔:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSPropertyListSerialization_Class /Reference/Reference.html – calimarkus 2012-03-07 16:43:38