您的位置:首页 > 其它

oc 学习(归档)

2015-12-28 18:46 190 查看
归档是一个过程,用某种格式来保存一个或多个对象,以便以后还原这些对象。通常, 这个过程包括将多个对象写入文件中,以便以后读取。

属性列表归档和带键值归档

使用xml属性列表进行归档

如果对象时NSString , NSDictionary, NSArray, NSData 或者NSNumber, 可以使用writeToFile:atomically, 该方法可以使用XML属性列表的格式写出数据。

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:
@"A class defined so other classes can inberit form it",
@"abstract class",
@"To implement all the methods defined in a protocal",
@"adopt",
@"Storing an object for later use.",
@"archiving",
nil];
if ([glossary writeToFile:@"/Users/lee/Desktop/practice/learn02/glossary" atomically:YES] == NO) {
NSLog(@"Save to file failed!");
}

}
return 0;
}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>abstract class</key>
<string>A class defined so other classes can inberit form it</string>
<key>adopt</key>
<string>To implement all the methods defined in a protocal</string>
<key>archiving</key>
<string>Storing an object for later use.</string>
</dict>
</plist>
~
~
~
~
~
~
~
~
~
~
"glossary" 12L, 446C


atomically 参数被设为yes表示希望首先将字典写入临时备份文件中一旦成功,将把最终数据转移到名为glossary的制定文件中。

读取

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

NSDictionary *glossary;
glossary = [NSDictionary dictionaryWithContentsOfFile:@"/Users/lee/Desktop/practice/learn02/glossary"];
for (NSString *key in glossary) {
NSLog(@"%@ : %@", key, [glossary objectForKey:key]);
}

}
return 0;
}


使用NSKeyedArchiver归档

要使用其创建连续的归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:
@"A class defined so other classes can inberit form it",
@"abstract class",
@"To implement all the methods defined in a protocal",
@"adopt",
@"Storing an object for later use.",
@"archiving",
nil];
[NSKeyedArchiver archiveRootObject:glossary toFile:@"/Users/lee/Desktop/practice/learn02/glossary.archive"];
}

return 0;
}


leedeMacBook-Pro:learn02 lee$ vi glossary.archive

bplist00Ô^A^B^C^D^E^F!"X$versionX$objectsY$archiverT$top^R^@^A<86> ©^G^H^U^V^W^X^Y^Z^[U$nullÓ
^K^L^P^TWNS.keysZNS.objectsV$class£^M^N^O<80>^B<80>^C<80>^D£^Q^R^S<80>^E<80>^F<80>^G<80>^HUadoptYarchiving^abstract class_^P2To implement all the methods defined in a protocal_^P Storing an object for later use._^P4A class defined so other classes can inberit form itÒ^\^]^^^_Z$classnameX$classes\NSDictionary¢^^ XNSObject_^P^ONSKeyedArchiverÑ#$Troot<80>^A^@^H^@^Q^@^Z^@#^@-^@2^@7^@A^@G^@N^@V^@a^@h^@l^@n^@p^@r^@v^@x^@z^@|^@~^@<84>^@<8e>^@<9d>^@Ò^@õ^A,^A1^A<^AE^AR^AU^A^^Ap^As^Ax^@^@^@^@^@^@^B^A^@^@^@^@^@^@^@%^@^@^@^@^@^@^@^@^@^@^@^@^@^@^Az


写入:

#import <Foundation/Foundation.h>
#import "Fraction.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {

NSDictionary *glossary;
glossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lee/Desktop/practice/learn02/glossary.archive"];
for(NSString *key in glossary){
NSLog(@"%@ : %@", key, [glossary objectForKey:key]);
}
}

return 0;
}


以上方法并不能归档自定义类。如果要自定义类归档,则必须完成 encodeWithCoder:方法和initWithCoder:方法的实现,

encodeWithCoder: 告知归档程序如何进行归档编码initWithCoder: 每次从指定的类解码对象

//
//  main.m
//  learn02
//
//  Created by lee on 15/12/26.
//  Copyright © 2015年 ltybrp. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Fraction.h"

@interface AddressCard: NSObject <NSCoding>
@property (copy, nonatomic) NSString *name, *email;

-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail;
-(NSComparisonResult) compareNames :(id) element;
-(void) print;
-(void) assignName:(NSString *) theName andEmail :(NSString *) theEmail;

@end

@implementation AddressCard
@synthesize name;
@synthesize email;
-(void) encodeWithCoder:(NSCoder *)aCoder{
// [super encodeWithCoder: aCoder];
[aCoder encodeObject:name forKey:@"AddressCardName"];
[aCoder encodeObject:email forKey:@"AddressCardEmail"];
}
-(id) initWithCoder:(NSCoder *)aDecoder{
// self = [super initWithCoder: aDecoder];
name = [aDecoder decodeObjectForKey:@"AddressCardName"];
email = [aDecoder decodeObjectForKey:@"AddressCardEmail"];
return self;
}
-(void) assignName:(NSString *)theName andEmail:(NSString *)theEmail{

name = theName;
email = theEmail;
}
-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail{
name = theName;
email = theEmail;
}
-(void) print{
NSLog(@"%@ : %@", self.name, self.email);
}

-(NSComparisonResult) compareNames:(id)element{
if ([name compare:[element name]] != NSOrderedSame) {
return [name compare:[element name]];
} else
return [email compare:[element email]];
}

@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
AddressCard *card1 = [[AddressCard alloc]init];
AddressCard *card2 = [[AddressCard alloc]init];
AddressCard *card3 = [[AddressCard alloc]init];

NSString *name1 = @"A";
NSString *ad1 = @"4";

NSString *name2 = @"A";
NSString *ad2 = @"2";

NSString *name3 = @"B";
NSString *ad3 = @"2";

[card1 setName:name1 andEmail:ad1];
[card2 setName:name2 andEmail:ad2];
[card3 setName:name3 andEmail:ad3];

NSMutableArray *array = [NSMutableArray arrayWithObjects:card1,card2,card3, nil];
[array sortUsingComparator:^NSComparisonResult(id objc1, id objc2){
if ([[objc1 name] compare:[objc2 name]] != NSOrderedSame) {
return [[objc2 name]compare:[objc2 name]];
} else
return [[objc1 email]compare:[objc2 email]];
}];

// NSLog(@"%@",[array description]);
if([NSKeyedArchiver archiveRootObject:array toFile:@"/Users/lee/Desktop/practice/learn02/glossary"] == NO){
NSLog(@"archiving failed");
}

NSMutableArray *w_array = [[NSMutableArray alloc]init];
w_array = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lee/Desktop/practice/learn02/glossary"];

for(id node in w_array){
[node print];
}

}

return 0;
}


使用NSData创建自定义档案
//
//  main.m
//  learn02
//
//  Created by lee on 15/12/26.
//  Copyright © 2015年 ltybrp. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Fraction.h"

@interface AddressCard: NSObject <NSCoding>
@property (copy, nonatomic) NSString *name, *email;

-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail;
-(NSComparisonResult) compareNames :(id) element;
-(void) print;
-(void) assignName:(NSString *) theName andEmail :(NSString *) theEmail;

@end

@implementation AddressCard
@synthesize name;
@synthesize email;
-(void) encodeWithCoder:(NSCoder *)aCoder{
// [super encodeWithCoder: aCoder];
[aCoder encodeObject:name forKey:@"AddressCardName"];
[aCoder encodeObject:email forKey:@"AddressCardEmail"];
}
-(id) initWithCoder:(NSCoder *)aDecoder{
// self = [super initWithCoder: aDecoder];
name = [aDecoder decodeObjectForKey:@"AddressCardName"];
email = [aDecoder decodeObjectForKey:@"AddressCardEmail"];
return self;
}
-(void) assignName:(NSString *)theName andEmail:(NSString *)theEmail{

name = theName;
email = theEmail;
}
-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail{
name = theName;
email = theEmail;
}
-(void) print{
NSLog(@"%@ : %@", self.name, self.email);
}

-(NSComparisonResult) compareNames:(id)element{
if ([name compare:[element name]] != NSOrderedSame) {
return [name compare:[element name]];
} else
return [email compare:[element email]];
}

@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
AddressCard *card1 = [[AddressCard alloc]init];
AddressCard *card2 = [[AddressCard alloc]init];
AddressCard *card3 = [[AddressCard alloc]init];

NSString *name1 = @"A";
NSString *ad1 = @"4";

NSString *name2 = @"A";
NSString *ad2 = @"2";

NSString *name3 = @"B";
NSString *ad3 = @"2";

[card1 setName:name1 andEmail:ad1];
[card2 setName:name2 andEmail:ad2];
[card3 setName:name3 andEmail:ad3];

NSMutableArray *array = [NSMutableArray arrayWithObjects:card1,card2,card3, nil];
[array sortUsingComparator:^NSComparisonResult(id objc1, id objc2){
if ([[objc1 name] compare:[objc2 name]] != NSOrderedSame) {
return [[objc2 name]compare:[objc2 name]];
} else
return [[objc1 email]compare:[objc2 email]];
}];

/*编码
NSMutableData *dataArea = [NSMutableData data];
NSKeyedArchiver *archiver;
int a = 100;
archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dataArea];
[archiver encodeObject:array forKey:@"AddressData"];
[archiver encodeInt:a forKey:@"Int"];
[archiver finishEncoding];

*/
//解码
if([dataArea  writeToFile:@"/Users/lee/Desktop/practice/learn02/glossary" atomically:YES] == NO){
NSLog(@"archiving failed");
}

NSKeyedUnarchiver* unachiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:dataArea];
NSMutableData *undata = [NSMutableData dataWithContentsOfFile:@"/Users/lee/Desktop/practice/learn02/glossary"];
if(!undata){
NSLog(@"Cant't read back rachive file");
}
NSMutableArray *unarray = [unachiver decodeObjectForKey: @"AddressData"];
int b = [unachiver decodeIntForKey:@"Int"];

[unachiver finishDecoding];

for(id node in unarray){
[node print];
}

printf("%d\n",b);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: