iOS学习(OC语言)知识点整理
一、归档与解归档的操作
1)归档是一个过程,将一个或多个对象存储起来,以便以后可以还原,包括将对象存入文件,以后再读取
将数据对象归档成plist文件
2)plist文件中只能存放:NSString、NSDate、NSNumber、Bool、NSData、NSArray、NSDictionary
并且NSArray和NSDictionary中只能是以上的类型
3)归档存放时数据是什么类型,读取数据时就用什么类型的数据接收。
4)归档不能直接操作自定义对象类型的数据。
5)归档与解归档操作实例代码 :
1//创建一个二维数组(数组中每个元素又是一个数组对象)2NSMutableArray *array1=[[NSMutableArray alloc]init];3for(inti=0;i<4;i++){4[array1 addObject:[NSString stringWithFormat:@"str%d",i+1]];5}67NSMutableArray *array2=[[NSMutableArray alloc]init];8for(inti=0;i<5;i++){9[array2 addObject:[NSNumber numberWithInt:arc4random()%100]];10}1112NSArray *bigArray=@[array1,array2];13//将数组对象写入文件,(先写入内存中,如果写入成功,马上存入文件)14[bigArray writeToFile:@"/Users/kingkong/Desktop/day08/array.plist"atomically:YES];1516//将plist文件的内容直接读取出存入数组17NSArray *newArray=[[NSArray alloc]initWithContentsOfFile:@"/Users/kingkong/Desktop/day08/array.plist"];18NSLog(@"%@",newArray);1920NSArray *emails=@[@"zhangsan@163.com",@"zhangsan@QQ.com"];21//创建一个字典对象22NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",@"123456",@"passWord",emails,@"email", nil];23//将字典对象写入文件24[dict writeToFile:@"/Users/kingkong/Desktop/day08/dict.plist"atomically:YES];2526//将plist文件的内如读取出来存入字典27NSDictionary *newDict=[NSDictionary dictionaryWithContentsOfFile:@"/Users/kingkong/Desktop/day08/dict.plist"];28NSLog(@"%@",newDict);
6)归档与解归档自定义类数据 实例代码:
1、定义一个Birthday类,在.h文件中遵守NSCoding 协议 例如:
1@interface Birthday : NSObject<NSCoding>2//出生日期类,年、月、日3@PRoperty(nonatomic,assign)intyear;4@property(nonatomic,assign)intmonth;5@property(nonatomic,assign)intday;6@end
2、在.m文件中实现NSCoding协议方法 例如:
1#import"Birthday.h"2@implementation Birthday3//在归档时自动调用这个方法,将所有的成员变量编码(给成员变量设置相应的键) -(void)encodeWithCoder:(NSCoder *)aCoder4{5[aCoder encodeInt:_year forKey:@"year"];6[aCoder encodeInt:_month forKey:@"month"];7[aCoder encodeInt:_day forKey:@"day"];8}910-(id)initWithCoder:(NSCoder *)aDecoder11{12if(self=[super init]){13_year=[aDecoder decodeIntForKey:@"year"];14_month=[aDecoder decodeIntForKey:@"month"];15_day=[aDecoder decodeIntForKey:@"day"];16}17returnself;18}19@end
3、在 main 文件中执行归档与解归档方法 例如:
1Birthday *b=[[Birthday alloc]init];2b.year=2015;3b.month=10;4b.day=25;56//b必须遵守归档协议7NSString *path=@"/Users/kingkong/Desktop/day09/Birthday.data";8//执行归档操作9BOOL ret=[NSKeyedArchiver archiveRootObject:b toFile:path];10if(ret){11//执行解归档操作12Birthday *b2=[NSKeyedUnarchiver unarchiveObjectWithFile:path];13NSLog(@"year:%i",b2.year);14}
7)将多个对象归档到一个文件中 实例代码
1、定义一个Person类 在.h文件中遵守NSCoding协议 例如:
1#import <Foundation/Foundation.h>2//如果要对对象进行归档,必须遵守归档协议,实现协议中规范的方法3@interface Person : NSObject<NSCoding>4@property(nonatomic,copy)NSString *name;5@property(nonatomic,assign)intage;6-(void)print;7@end
2、在.m中实现协议方法 例如:
1#import"Person.h"2@implementation Person3//在归档时自动调用这个方法,将所有的成员变量编码(给成员变量设置相应的键)4- (void)encodeWithCoder:(NSCoder *)aCoder5{6NSLog(@"%@",NSStringFromSelector(_cmd));
//encodeInt 用于整型数据 encodeObject 用于字符串或对象7[aCoder encodeObject:_name forKey:@"name"];8[aCoder encodeInt:_age forKey:@"age"];9}10//解归档时自动调用此方法11- (id)initWithCoder:(NSCoder *)aDecoder12{13//如果父类也遵守了归档协议,self=[super initWithCode:aDecode]14if(self=[super init]){15//根据编码时的键取值decodeIntForKey 用于整型数据 decodeObjectForKey 用于字符串或对象16_name=[aDecoder decodeObjectForKey:@"name"];17_age=[aDecoder decodeIntForKey:@"age"];18}19returnself;20}21-(void)print22{23NSLog(@"name:%@,age:%d",_name,_age);24}25@end
3、在main文件中执行方法 例如:
1Person *p1=[[Person alloc]init];2p1.name=@"kingkong";3p1.age=20;45NSArray *array1=@[@"red",@"blue",@"yellow"];67//创建一个对象的缓冲区空间8NSMutableData *mutableData=[[NSMutableData alloc]init];9//创建一个归档器,关联一个对象的缓冲区10NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:mutableData];11//将对象编码后存入缓冲区12[archiver encodeObject:p1 forKey:@"person"];13[archiver encodeObject:array1 forKey:@"array"];14//编码结束15[archiver finishEncoding];//16//将缓冲区中的数据写入到文件中17NSString *path=@"/Users/kingkong/Desktop/day09/doc.data";18BOOL ret=[mutableData writeToFile: path atomically:YES];19NSLog(@"ret=%d",ret);2021//解归档操作22NSData *data=[NSData dataWithContentsOfFile: path];23//创建一个解归档器对象指定数据所在的缓冲区24NSKeyedUnarchiver *unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:data];25//使用解归档器提取数据26Person *p2=[unarchiver decodeObjectForKey:@"person"];27NSArray *array2=[unarchiver decodeObjectForKey:@"array"];28//解归档结束29[unarchiver finishDecoding];30//NSLog(@"%@,%d",p2.name,p2.age);
31[p2 print];32NSLog(@"%@",array2);