如何在plist中存储对象

How to store objects in plist

我有一些 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];
}

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

所以 NSValueCGPoint 似乎在写入文件的过程中被设置为 nil。我不知道我做错了什么,所以感谢您的帮助。谢谢!

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