Object-c 归档--源自技术

来源:互联网 发布:什么测温软件准确 编辑:程序博客网 时间:2024/05/21 09:12

一、OBj-C类的归档包含以下:

NString、NSArray、NSDicionary、NSSet、NSDate、NSNumber、NSdata。这还包括嵌套对象,如包含字符串,甚至其他数组对象的数组。

可以使用writeToFile、writeToURL归档

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;

可以使用dictionaryWithContentsOfFile、dictionaryWithContentsOfURL、initWithContentsOfFile、initWithContentsOfURL还原

+ (id /* NSDictionary * */)dictionaryWithContentsOfFile:(NSString *)path;

+ (id /* NSDictionary * */)dictionaryWithContentsOfURL:(NSURL *)url;

- (id /* NSDictionary * */)initWithContentsOfFile:(NSString *)path;

- (id /* NSDictionary * */)initWithContentsOfURL:(NSURL *)url;


二、NSKeyedArchiver(加密)

上述OBj-C类可以直接使用以下方法进行编码和解码

+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;

+ (id)unarchiveObjectWithFile:(NSString *)path;


自定义的类需要实现NSCoding协议的encodeWithCoder、initWithCoder函数,然后使用NSKeyedArchiver进行编码和解码

[objc] view plain copy
  1. -(void) encodeWithCoder:(NSCoder *)aCoder  
  2. {  
  3.     [super encodeWithCoder:aCoder];//先执行父类的编码  
  4.     [aCoder encodeObject:km forKey:@"UserDetailswl"];  
  5.     [aCoder encodeDouble:mark forKey:@"UserDetailsmark"];  
  6.     NSLog(@"UserDetails encode-------");  
  7. }  
  8.   
  9. -(id) initWithCoder:(NSCoder *)aDecoder  
  10. {  
  11.     self = [super initWithCoder:aDecoder];<span style="font-family: Menlo; ">//先执行父类的解码</span>  
  12.     if (self) {  
  13.         km = [aDecoder decodeObjectForKey:@"UserDetailswl"];  
  14.         mark = [aDecoder decodeDoubleForKey:@"UserDetailsmark"];  
  15.         NSLog(@"UserDetails decoder-------------");  
  16.     }  
  17.     return self;  
  18. }  

三、时用NSData批量归档

[objc] view plain copy
  1. +(void) objEncodeAndDncodeNsData  
  2. {  
  3.     UserDetails * details;  
  4.     UserDetails * details2;  
  5.     NSMutableData * date;  
  6.     NSKeyedArchiver * archiver;  
  7.     NSString * path;  
  8.       
  9.     details = [[UserDetails alloc] init];  
  10.     details.km = @"物理";  
  11.     details.mark = 12.6;  
  12.     details.name = @"小静静";  
  13.     details.age = [[NSNumber alloc] initWithInt:18];  
  14.       
  15.     details2 = [[UserDetails alloc] init];  
  16.     details2.km = @"数学";  
  17.     details2.mark = 24;  
  18.     details2.name = @"那英";  
  19.     details2.age = [[NSNumber alloc] initWithInt:18];  
  20.       
  21.     date = [NSMutableData data];  
  22.     archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:date];  
  23.     [archiver encodeObject:details forKey:@"details"];  
  24.     [archiver encodeObject:details2 forKey:@"details2"];  
  25.     [archiver finishEncoding];  
  26.       
  27.     path =[[NSString alloc] initWithFormat:@"%@details.archive",NSTemporaryDirectory()];  
  28.     if ([date writeToFile:path atomically:YES]) {  
  29.         NSLog(@"归档成功!");  
  30.     }  
  31.       
  32.     NSLog(@"--------解码-------");  
  33.     UserDetails * details_;  
  34.     UserDetails * details2_;  
  35.     NSMutableData * date_;  
  36.     NSKeyedUnarchiver * unArchiver;  
  37.       
  38.     date_ = [NSMutableData dataWithContentsOfFile:path];  
  39.     unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:date_];  
  40.       
  41.     details_ = [unArchiver decodeObjectForKey:@"details"];  
  42.     details2_ = [unArchiver decodeObjectForKey:@"details2"];  
  43.       
  44.     [unArchiver finishDecoding];  
  45.       
  46.     NSLog(@"details_ :%@",details_);  
  47.     NSLog(@"details2_ :%@",details2_);  
  48.     NSLog(@"details_.km=%@ ,details_.mark=%lf ,details_.name=%@ ,details_.age=%@ ",details_.km,details_.mark,details_.name,details_.age);  
  49.     NSLog(@"details2_.km=%@ ,details2_.mark=%lf ,details2_.name=%@ ,details2_.age=%@ ",details2_.km,details2_.mark,details2_.name,details2_.age);  
  50. }  
四、使用NSdata和NSKeyedArchiver实现深复制

[objc] view plain copy
  1. +(void) objCopy  
  2. {  
  3.     NSMutableArray * array;  
  4.     NSMutableArray * array_;  
  5.     NSData * data;  
  6.       
  7.     array = [[NSMutableArray alloc] initWithObjects:@"a",@"b",@"c", nil nil];  
  8.     data = [NSKeyedArchiver archivedDataWithRootObject:array];  
  9.     array_ = [NSKeyedUnarchiver unarchiveObjectWithData:data];  
  10.       
  11.     [array addObject:@"d"];  
  12.       
  13.     for (int i=0; i<[array count]; i++) {  
  14.         NSLog(@"array %i %@",i+1,[array objectAtIndex:i]);  
  15.     }  
  16.       
  17.     for (int i=0; i<[array_ count]; i++) {  
  18.         NSLog(@"array_ %i %@",i+1,[array objectAtIndex:i]);  
  19.     }  
  20. }  
0 0
原创粉丝点击