在開發中經常需要對一些物件進行儲存,當然這是一些很輕量級的,我們首先會想到使用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屬性的...