使用runtime歸檔模型物件

2021-07-11 20:35:43 字數 2494 閱讀 4753

在開發中經常需要對一些物件進行儲存,當然這是一些很輕量級的,我們首先會想到使用nsuserdefaults進行儲存,但是nsuserdefaults所能直接儲存的物件型別也是有限的,比如nsarray,nsdata,nsdictionary,nsnumber,nsstring,對於我們自己建立的模型物件,nsuserdefaults直接儲存的話,就有點力不從心了,這時,我們往往要對模型物件進行歸檔,歸檔雖說實現簡單,但是,試想一些,如果你的模型成員比較多,手動實現很費時間,可以新建乙個nsobject的分類,使用runtime遍歷屬性實現歸檔

. h 檔案

//

// dvvcoding.h

// dvvcoding

//// created by 大威 on 2016/11/21.

//#import

@protocol dvvcodingdelegate @optional

/** 如果有不想快取的屬性,通過此**方法返回就可以了

*/+ (nsarray *)dvv_codingignoreproperties;

@end

@inte***ce nsobject (dvvcoding)

/** * 解碼(從檔案解析物件)

*/- (void)dvv_decode:(nscoder *)decoder;

/** * 編碼(將物件寫入檔案)

*/- (void)dvv_encode:(nscoder *)encoder;

/** * 屬性歸檔的實現

*/#define dvvcodingimplementation \

- (instancetype)initwithcoder:(nscoder *)adecoder \

\return self; \

} \\

- (void)encodewithcoder:(nscoder *)coder \

@end

. m 檔案
//

// dvvcoding.m

// dvvcoding

//// created by 大威 on 2016/11/21.

//#import "dvvcoding.h"

#import

typedef ns_enum(nsuinteger, dvvcodingtype)

;@implementation

nsobject (dvvcoding)

- (void)dvv_encode:(nscoder *)encoder

- (void)dvv_decode:(nscoder *)decoder

- (void)dvv_codingfor:(nscoder *)coder type:(dvvcodingtype)type

if (!ignoreproperties) ignoreproperties = [nsarray array];

// 新增預設忽略的屬性

nsmutablearray *defaultignoreproperties = [nsmutablearray arraywithobjects:@"hash", @"superclass", @"description", @"debugdescription", nil];

ignoreproperties = [defaultignoreproperties arraybyaddingobjectsfromarray:ignoreproperties];

unsigned

int count;

// 獲取屬性列表

objc_property_t *properties = class_copypropertylist(self

.class, &count);

for (unsigned

int i = 0; i < count; i++)

}if (flage)

}// 用來儲存乙個屬性值

nsstring *propertyvalue = nil;

// 編碼

if (dvvcodingtypeencode == type)

// 解碼

else

if (dvvcodingtypedecode == type)

}// 釋放

free(properties);

}@end

直接在模型物件的implementation裡呼叫巨集
#import

"mmrdmuserinfo.h"

@implementation mmrdmuserinfo

// 呼叫這句巨集定義,即可實現物件歸檔,不用自己再對每乙個屬性寫繁瑣的編碼和解碼

dvvcodingimplementation

/** 如果有不想快取的屬性,通過此**方法返回

@return 忽略列表

*/+ (nsarray *)dvv_codingignoreproperties

@end

iOS 物件的歸檔 解檔 runtime

ios 物件的歸檔 解檔 runtime 若要例項物件實現歸檔解檔,需要該類遵守nscoding協議,及以下協議方法 專案中以ycarchivebase類為例,可直接新增屬性使用 歸檔和接檔的操作以類方法實現如下 可自己建立管理類分離出去 archivefilepath 為檔案儲存路徑 void a...

iOS 對模型物件進行歸檔

歸檔是指一種形式的序列化,專門編寫用於儲存資料的任何物件都應該支援歸檔。使用對模型物件進行歸檔的技術可以輕鬆將複雜的物件寫入檔案,然後再從中讀取它們。只要在類中實現的每個屬性都是標量或者都是遵循nscoding協議的某個類的例項,你就可以對整個物件進行完全歸檔。大多數的foundation和coco...

利用runtime進行歸檔解檔

做過ios開發的應該都知道資料的本地化的方式,其中歸檔就是其中的一種。說實話,在本人在專案中並不是很常用歸檔來進行資料的本地儲存。今天之所以寫這篇部落格是因為最近了解到原來我們還能利用runtime進行歸檔和解檔。先來看一下我們之前的歸檔 解檔 例如我們要對person這個擁有name和age屬性的...