1. NSUserDefaults
1.什么是NSUserDefaults,有什么用?
对于应用来说,每个用户都有自己的独特偏好设置,而好的应用会让用户根据喜好选择合适的使用方式,把这些偏好记录在应用包的plist文件中。如果有一些设置你希望用户即使升级后还可以继续使用,比如玩游戏时得过的最高分、喜好和通知设置、主题颜色甚至一个用户头像,那么你可以使用NSUserDefaults来存储这些信息。
NSUserDefaults同key-value方式对应存入plist文件中,那么value就要符合plist文件可以存取的格式NSData、NSString、NSDictionary、NSDate、NSArray、NSNumber,如果存入对象不是以上类型,那么必须转变成NSData类型然后在存入
The NSUserDefaults class provides convenience methods for accessing common types such as floats, doubles, integers, Booleans, and URLs. A default object must be a property list—that is, an instance of (or for collections, a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of NSData.
以上存放方法都会有一种问题如果第一次去取key为“Login”的值,但是没有找到这个key就有可能返回不是想要的东西;
解决方案:
[[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];
给这个key给定一个默认值,因为NSUserDefaults会先在应用域中查找,如果找到了值,NSUserDefaults就会返回这个值。如果没有找到,NSUserDefaults就会在注册域中查找并返回默认值。
#pragma mark - User Default
// 存储用户偏好设置
+ (void)saveUserData:(id)data forKey:(NSString *)key {
[[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 读取用户偏好设置
+ (id)readUserDataForKey:(NSString *)key {
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
return obj;
}
// 删除用户偏好设置
+ (void)removeUserDataForkey:(NSString *)key {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
2.NSKeyedArchiver
1.什么是NSKeyedArchiver?
provides a way to encode objects (and scalar values) into an architecture-independent format that can be stored in a file. When you archive a set of objects
提供一种编码格式,可以将OC的对象保存在文件中
2.什么是 NSKeyedUnarchiver?
decodes the data in an archive and creates a set of objects equivalent to the original set.
将文件中的OC对象恢复成内存中的一个OC对象。
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以
NSCoding协议有2个方法:
encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量
initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量
// 把对象归档存到沙盒里
+ (BOOL)saveObject:(id)object byFileName:(NSString *)fileName {
NSString *path = [self appendFilePath:fileName];
path = [path stringByAppendingString:@".archive"];
BOOL success = [NSKeyedArchiver archiveRootObject:object toFile:path];
return success;
}
// 通过文件名从沙盒中找到归档的对象
+ (id)getObjectByFileName:(NSString*)fileName {
NSString *path = [self appendFilePath:fileName];
path = [path stringByAppendingString:@".archive"];
id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
return obj;
}
// 根据文件名删除沙盒中的文件
+ (void)removeObjectByFileName:(NSString *)fileName {
NSString *path = [self appendFilePath:fileName];
path = [path stringByAppendingString:@".archive"];
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}
+ (NSString *)appendFilename:(NSString *)fileName {
// 1. 沙盒缓存路径
NSString *cachesPath = [NSFileManager cachesPath];
if (![[NSFileManager defaultManager] fileExistsAtPath:cachesPath isDirectory:nil]) {
[[NSFileManager defaultManager] createDirectoryAtPath:cachesPath withIntermediateDirectories:NO attributes:nil error:nil];
}
return cachesPath;
}
// 拼接文件路径
+ (NSString *)appendFilePath:(NSString *)fileName {
// 1. 沙盒缓存路径
NSString *cachesPath = [NSFileManager cachesPath];
NSString *filePath = [NSString stringWithFormat:@"%@/%@",cachesPath,fileName];
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:nil]) {
[[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:NO attributes:nil error:nil];
}
return filePath;
}