1

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

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

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

我还希望对信息进行加密。所以我将它转换NSDictionaryNSData加密它。

- (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. 此时,self.plist可能已经(但不一定)加密,写入文件,然后设置为文件的未加密版本。

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

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

因此,在写入文件的过程中似乎将NSValuewith设置为。我不知道我做错了什么,所以任何帮助表示赞赏。谢谢!CGPointnil

4

1 回答 1

0

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

于 2015-04-21T00:48:01.253 回答