如何在plist中存储对象

时间:2015-04-21 00:33:34

标签: objective-c encryption nsdictionary plist nsvalue

我有一些CGPoint我需要存储在NSDictionary然后写入文件。稍后,我需要能够将文件加载到NSDictionary并访问其中的CGPoint

self.dict是我要存储点的NSDictionary。

- (void)setPoint:(CGPoint)point forKey:(NSString *)key {
    NSValue *value = [NSValue valueWithCGPoint:point];
    [self.dict setValue:value forKey:key];
}

我也想要加密信息。因此,我将NSDictionary转换为NSData以加密它。

- (void)encryptDictionaryWithKey:(NSData *)key writeToFile:(NSString *)file {
    NSData *encryptedDict = [[NSKeyedArchiver archivedDataWithRootObject:self] encryptWithKey:key];
    [encryptedDict writeToFile:file atomically:YES];
}

然后从文件中获取信息,解密并将其放入NSDictionary格式:

+ (NSDictionary *)dictionaryWithContentsOfEncryptedData:(NSData *)data     decryptWithKey:(NSData *)key {
    NSData *decryptedData = [data decryptedWithKey:key];
    return (NSDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:decryptedData];
}

我可以将其他一些值(如NSNumber)放入NSDictionary,加密并将其写入文件,然后从文件中获取并解密... ...值仍然存在圆通。所以我的代码似乎很好。但它不适用于NSValue

我用它从NSValue获取CGPoint。此时,self.plist可能已经(但不一定)加密,写入文件,然后设置为文件的未加密版本。

- (CGPoint)pointForKey:(NSString *)key {
    NSValue *value = [self.prefs objectForKey:key];
    return [value CGPointValue];
}

如果value == nil已加密,写入文件,然后从文件加载并且未加密,则此代码仅返回0,0(和self.plist)。

因此,在写入文件的过程中NSValue CGPoint似乎设置为nil。我不知道我做错了什么,所以感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将CGPoint转换为可以存储在plist中的对象。例如, CGPointCreateDictionaryRepresentation() function会将CGPoint转换为NSDictionary(或者更确切地说,CFDictionaryRef可以转换为NSDictionary。您可以将其存储在plist中,然后在加载plist时使用CGPoint随附函数将其返回转换为CGPointMakeWithDictionaryRepresentation()