1. NSUserDefaults
1.什么是NSUserDefaults衫仑,有什么用梨与?
對于應用來說,每個用戶都有自己的獨特偏好設置文狱,而好的應用會讓用戶根據(jù)喜好選擇合適的使用方式粥鞋,把這些偏好記錄在應用包的plist文件中。如果有一些設置你希望用戶即使升級后還可以繼續(xù)使用瞄崇,比如玩游戲時得過的最高分呻粹、喜好和通知設置壕曼、主題顏色甚至一個用戶頭像,那么你可以使用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協(xié)議的對象才可以
NSCoding協(xié)議有2個方法:
encodeWithCoder:
每次歸檔對象時率碾,都會調用這個方法。一般在這個方法里面指定如何歸檔對象中的每個實例變量,可以使用encodeObject:forKey:方法歸檔實例變量
initWithCoder:
每次從文件中恢復(解碼)對象時,都會調用這個方法。一般在這個方法里面指定如何解碼文件中的數(shù)據(jù)為對象的實例變量诵竭,可以使用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;
}
// 根據(jù)文件名刪除沙盒中的文件
+ (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;
}