如何在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
已加密,写入文件,然后从文件加载且未加密。
所以 NSValue
和 CGPoint
似乎在写入文件的过程中被设置为 nil
。我不知道我做错了什么,所以感谢您的帮助。谢谢!
您可以将 CGPoint
转换为可以存储在 plist 中的对象。例如,
CGPointCreateDictionaryRepresentation()
function 会将 CGPoint
转换为 NSDictionary
(或者更确切地说,CFDictionaryRef
可以转换为 NSDictionary
)。您可以将其存储在 plist 中,然后在加载 plist 时使用 CGPointMakeWithDictionaryRepresentation()
配套函数将其 back 转换为 CGPoint
。
我有一些 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
已加密,写入文件,然后从文件加载且未加密。
所以 NSValue
和 CGPoint
似乎在写入文件的过程中被设置为 nil
。我不知道我做错了什么,所以感谢您的帮助。谢谢!
您可以将 CGPoint
转换为可以存储在 plist 中的对象。例如,
CGPointCreateDictionaryRepresentation()
function 会将 CGPoint
转换为 NSDictionary
(或者更确切地说,CFDictionaryRef
可以转换为 NSDictionary
)。您可以将其存储在 plist 中,然后在加载 plist 时使用 CGPointMakeWithDictionaryRepresentation()
配套函数将其 back 转换为 CGPoint
。