ios 歸檔和解歸檔(利用runtime)

前言

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纫谅,隨后出現(xiàn)的幾起案子炫贤,更是在濱河造成了極大的恐慌,老刑警劉巖系宜,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件照激,死亡現(xiàn)場離奇詭異,居然都是意外死亡盹牧,警方通過查閱死者的電腦和手機俩垃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汰寓,“玉大人口柳,你說我怎么就攤上這事∮谢” “怎么了跃闹?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毛好。 經(jīng)常有香客問我望艺,道長,這世上最難降的妖魔是什么肌访? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任找默,我火速辦了婚禮,結(jié)果婚禮上吼驶,老公的妹妹穿的比我還像新娘惩激。我一直安慰自己,他們只是感情好蟹演,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布风钻。 她就那樣靜靜地躺著,像睡著了一般酒请。 火紅的嫁衣襯著肌膚如雪骡技。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天羞反,我揣著相機與錄音哮兰,去河邊找鬼。 笑死苟弛,一個胖子當(dāng)著我的面吹牛喝滞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膏秫,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼右遭,長吁一口氣:“原來是場噩夢啊……” “哼做盅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窘哈,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吹榴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后滚婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體图筹,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年让腹,在試婚紗的時候發(fā)現(xiàn)自己被綠了远剩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡骇窍,死狀恐怖瓜晤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腹纳,我是刑警寧澤痢掠,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站嘲恍,受9級特大地震影響足画,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佃牛,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一淹辞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吁脱,春花似錦桑涎、人聲如沸彬向。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃胆。三九已至遍希,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間里烦,已是汗流浹背凿蒜。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胁黑,地道東北人废封。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像丧蘸,于是被迫代替她去往敵國和親漂洋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容