前言
iOS存取數(shù)據(jù)的方式有幾種菠隆,這次項目中存儲一些小數(shù)據(jù)所以用的歸檔券敌,希望對用歸檔存儲數(shù)據(jù)的同學(xué)有幫助乙埃。
iOS的幾種數(shù)據(jù)持久化方案
- NSKeyedArchiver(歸檔)
- preference(偏好設(shè)置)
- plist文件
- SQLite
- CoreData
自定義類歸與解檔
1.需要實現(xiàn)<NSCoding>代理方法
2.需要實現(xiàn)的方法
- (instancetype)initWithCoder:(NSCoder *)coder
- (void) encodeWithCoder: (NSCoder *)coder
利用runtime獲得所有屬性
- (NSArray *)getAllProperty {
NSMutableArray *array = [[NSMutableArray alloc]init];
unsigned int *count = malloc(sizeof(unsigned int));
//調(diào)用runtime方法
//Ivar:方法返回的對象內(nèi)容對象摆出,這里將返回一個Ivar類型的指針
//class_copyIvarList 方法可以捕獲到類的所有變量 將變量的數(shù)量存在一個 unsigned int指針中
Ivar *mem = class_copyIvarList([self class], count);
for (int i = 0; i < *count; i++) {
//通過移動指針進(jìn)行遍歷
Ivar var = * (mem + i);
//獲取變量的名稱
const char *name = ivar_getName(var);
NSString *varStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
[array addObject:varStr];
}
//釋放內(nèi)存
free(count);
//注意處理野指針
count = nil;
return array;
}
- initWithCoder
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
//獲取所有屬性
NSArray *porpertyArray = [self getAllProperty];
for (NSString *name in porpertyArray) {
//去掉屬性名前面的_
NSString *key = [name substringFromIndex:1];
//設(shè)置約定的鍵值對 c+key
[self setValue:[coder decodeObjectForKey:[NSString stringWithFormat:@"c%@",key]] forKey:key];
}
}
return self;
}
- encodeWithCoder
- (void)encodeWithCoder:(NSCoder *)coder {
//獲取所有屬性
NSArray *porpertyArray = [self getAllProperty];
for (NSString *name in porpertyArray) {
//去掉屬性名前面的_
NSString *key = [name substringFromIndex:1];
//設(shè)置約定的鍵值對 c+key
[coder encodeObject:[self valueForKey:key] forKey:[NSString stringWithFormat:@"c%@",key]];
}
}
3.存儲數(shù)據(jù)
- 自定義一個方法存儲數(shù)據(jù)
/**
存儲數(shù)據(jù)
@param OAuth 需要儲存的對象
@return 是否儲存成功
*/
+ (BOOL)saveOAuth:(OAuth *)OAuth;
- 方法實現(xiàn)
+ (BOOL)saveOAuth:(OAuth *)OAuth {
//獲取doc的目錄
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//拼接保存的路徑
NSString *filePath = [docPath stringByAppendingPathComponent:oauthPath];
//存儲返回用戶信息
return [NSKeyedArchiver archiveRootObject:OAuth toFile:filePath];
}
4.獲取存儲對象
- 自定義定義方法
/**
@return 獲取存儲對象
*/
+ (OAuth *)OAuth;
- 實現(xiàn)方法
+ (OAuth *)OAuth {
//獲取doc的目錄
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//拼接保存的路徑
NSString *filePath = [docPath stringByAppendingPathComponent:oauthPath];
//獲取用戶存儲的授權(quán)信息
OAuth *oAuth = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
if (!oAuth) {
oAuth = [[OAuth alloc]init];
}
return oAuth;
}
5.刪除所有歸檔
- 自定義方法
/**
刪除所有歸檔
*/
+ (void)logOut;
- 實現(xiàn)方法
+ (void)logOut {
//獲取doc的目錄
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//拼接保存的路徑
NSString *filePath = [docPath stringByAppendingPathComponent:oauthPath];
//刪除路徑.data文件
NSFileManager *fileManage = [NSFileManager defaultManager];
[fileManage removeItemAtPath:filePath error:nil];
}
總結(jié)
以上是我用歸檔存儲數(shù)據(jù)的代碼枚驻。
github