標籤:
NSCoder類1,概述
將對象的執行個體變數和其他資料編碼為資料區塊,然後將他們存在到磁碟當中;以後將這些資料區塊讀回到記憶體中,並且還基於儲存的資料建立新的對象,也稱序列化或還原序列化。
2,用法
a,首先,定義一個類,使其遵守<NSCoding>協議
@interface Thingie:NSObject <NSCoding>{
NSString *name;
int magicNumber;
float shoeSize;
NSMutableArray *subThingies;
}
@property (copy) NSString *name;
@property int magicNumber;
@property float shoeSize;
@property (retain) NSMutableArray *subThingies;
-(id)initWithName:(NSString *)n
magicNumber:(int)mn
shoeSize:(float)ss;
@end//interface Thingie
實作類別
@implementation Thingie
@synthesize name;
@synthesize magicNumber;
@synthesize shoeSize;
@synthesize subThingies;
-(id)initWithName:(NSString *)n
magicNumber:(int)mn
shoeSize:(float)ss{
if(self==[super init]){
self.name=n;
self.magicNumber=mn;
self.shoeSize=ss;
self.subThingies=[NSMutableArray array];
}
return self;
}
實現<NSCoding>協議中的-encoderWithCoder和-initWithCoder
接以上代碼
-(void)encoderWithCoder:(NSCoder*)coder{
[coder encodeObject:name
forKey:@"name"];
[coder encodeObject:magicNumber
forKey:@"magicNumber"];
[coder encodeObject:shoeSize
forKey:@"shoeSize"];
[coder encodeObject:subThingies
forKey:@"subThingies"];
}//encodeWithCoder
-(id)initWithCoder:(NSCoder *)decoder{
if(self=[super init]{
self.name=[decoder decodeObjectForKey:@"name"];
self.magicNumber=[decoder decodeIntForKey:@"magicNumber"];
self.shoeSize=[decoder decodeFloatForKey:@"shoeSize"];
self.subThingies=[decoder decodeObjectForKey:@"subThingies"];
}
return self;
}//initWithCoder
b,再次,使用該類定義一個對象,初始化它。
Thingie *thing1;
thing1=[[Thingie alloc]
initWithName:@"thing1"
magicNumber:42
shoeSize:10.5];
c,定義一個NSData對象,並使用類方法:NSKeydArchiver對對象進行編碼後賦值給NSData對象。
NSData *freezeDried;
freezeDried=[NSKeyedArchiver archivedDataWithRootObject:thing1];
d,如果願意,可以將NSDataObject Storage Service到磁碟上
[freezeDried writeToFile:@"/tmp/verbiage.txt"
atomically:YES];
f,解碼NSData
thing1=[NSKeyedUnarchiver unarchiverObjectWithData:freezeDried];
3,注意點
如上所樣本中,NSMultableArray對象subThingies可以存放各種對象,但是不能儲存NSlog類,因為它不能檢測對象迴圈。
Objective-C日記-之編碼對象屬性