作者:可乐16311 | 来源:互联网 | 2023-05-18 15:26
OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件:想要把存放自定义类型的数组进行持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足:1.自定义
OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件:
想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足:
1. 自定义对象必须要序列化(将数据有序的存放)
2. 需要使用归档来进行持久化
3. 如果要加载持久化文件需要进行反序列化(就是将有序存放的数据读取并变成自定义对象)
第一要将自定义类型序列化以及第三步并将文件反序列化必须实现OC中的 协议。
以Student类为例
@interface Student : NSObject
@property(nonatomic,copy)NSString * name;
@property(nonatomic,copy)NSString * pwd;
@end
进行序列化的方法为
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.pwd forKey:@"pwd"];
}
进行反序列化的方法为:
-(id)initWithCoder:(NSCoder *)aDecoder
{
self= [super init];
if(self)
{
self.name=[aDecoder decodeObjectForKey:@"name"];
self.pwd=[aDecoder decodeObjectForKey:@"pwd"];
}
return self;
}
需要注意的是,我们在类的声明文件中并不需要声明这两个文件,因为我们只在本类中使用这两个方法,所以我们只需要在实现文件中实现这两个方法就可以了。
值得注意的是归档操作在外面实现这个协议的两个方法时就已经由系统实现,因此我们并不需要实现归档操作。我们需要的仅仅是将文件写入到指定的文件中,以及将该文件读取出来。我们可以理解为,我们在实现读取和写入的方法的过程中,实现了序列化和反序列化操作。进而实现了归档操作。写入文件和读取文件的代码如下:
[NSKeyedArchiver archiveRootObject:stuArr toFile:@"/Users/Administrator/Desktop/4.plist"];
[NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/Administrator/Desktop/4.plist"];
遍历该文件所包含的对象即可得到文件中所包含的对象的所有属性
for(Student * s in stuArr)
{
NSLog(@"%@,%@",s.name,s.pwd);
}