//聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄
一、變量聲明
為便于下文討論浙值,提前創(chuàng)建父類Biology以及子類Person:
Biology:
@interfaceBiology:NSObject{NSInteger*_hairCountInBiology;}@property(nonatomic,copy)NSString*introInBiology;@end@implementationBiology@end
Person:
#import#import"Biology.h"#import@interfacePerson:Biology{NSString*_father;}@property(nonatomic,copy)NSString*name;@property(nonatomic,assign)NSIntegerage;@end@implementationPerson@end
補充說明
凡是在父類中定義的屬性或者變量弟头,末尾都有InBiology標志性宏;反之也成立
二、問題引入
在iOS中一個自定義對象是無法直接存入到文件中的玛痊,必須先轉(zhuǎn)化成二進制流才行汰瘫。從對象到二進制數(shù)據(jù)的過程我們一般稱為對象的序列化(Serialization),也稱為歸檔(Archive)擂煞。同理混弥,從二進制數(shù)據(jù)到對象的過程一般稱為反序列化或者反歸檔。
在序列化實現(xiàn)中不可避免的需要實現(xiàn)NSCoding以及NSCopying(非必須)協(xié)議的以下方法:
-(id)initWithCoder:(NSCoder *)coder;-(void)encodeWithCoder:(NSCoder *)coder;-(id)copyWithZone:(NSZone *)zone;
假設我們現(xiàn)在需要對直接繼承自NSObject的Person類進行序列化,代碼一般長這樣子:
//對變量編碼- (void)encodeWithCoder:(NSCoder *)coder{? ? [coderencodeObject:self.nameforKey:@"name"];? ? [coderencodeObject:@(self.age)forKey:@"age"];? ? [coderencodeObject:_fatherforKey:@"_father"];//... ... other instance variables}//對變量解碼- (id)initWithCoder:(NSCoder *)coder{? ? self.name = [coderdecodeObjectForKey:@"name"];? ? self.age = [[coderdecodeObjectForKey:@"age"] integerValue];? ? _father = [coderdecodeObjectForKey:@"_father"];//... ... other instance variables
似乎so easy蝗拿?至少到目前為止是這樣的晾捏。但是請考慮以下問題:
若Person是個很大的類,有非常多的變量需要進行encode/decode處理呢哀托?
若你的工程中有很多像Person的自定義類需要做序列化操作呢惦辛?
若Person不是直接繼承自NSObject而是有多層的父類呢?(請注意仓手,序列化的原則是所有層級的父類的屬性變量也要需要序列化)胖齐;
如果采用開始的傳統(tǒng)的序列化方式進行序列化,在碰到以上問題時容易暴露出以下缺陷(僅僅是缺陷嗽冒,不能稱為問題):
工程代碼中冗余代碼很多
父類層級復雜容易導致遺漏點一些父類中的屬性變量
那是不是有更優(yōu)雅的方案來回避以上問題呢呀伙?那是必須的。這里我們將共同探討使用runtime來實現(xiàn)一種接口簡潔并且十分通用的iOS序列化與反序列方案添坊。
還有第二頁.
謝謝!!!