当前位置: 代码迷 >> 综合 >> iOS开发------本地存储-NSKeyedArchiver NSKeyedUnarchiver(归档)
  详细解决方案

iOS开发------本地存储-NSKeyedArchiver NSKeyedUnarchiver(归档)

热度:45   发布时间:2024-01-04 06:36:36.0

iOS下有很多中本地存储方式,但相比于CoreData,很多情况下还只是轻量级的数据,对于不是很复杂的数据,个人还是比较喜欢直接用归档或者plist文件来存储信息,毕竟存储的信息量没有那么大,用归档会比较轻便。

说到本地存储,不得不说NSUserDefaults,它是系统提供给我们很好的本地存储容器,比如单个的基础属性的存储用NSUserDefaults也很方便,但是如果存的是一个我们自己自定义的Model或者存放Model的数组字典的时候,用NSUserDefaults就会感觉比较麻烦,虽然一个属性一个属性的存也不是太麻烦,主要是害怕在不知情的时候存数据会把原数据覆盖掉,造成不小的麻烦。

归档是什么呢,是将数据序列化与反序列化,个人觉得还是比较喜欢理解成对数据进行编码与解码,在存入本地的时候按照固有的编码规则进行编码,在取得时候按照反编码进行编译,返回到存数据之前的数据,这里只说明一下如何对自定义的Model进行归档,其实单个属性的存档是一样的。

Blog中的所有代码GitHub:https://github.com/YRunIntoLove/KeyedarchiverDemo/tree/master

创建一个MessageObject的测试类,里面存放三个测试属性,要说一下,要完成归档存储的对象,必须履行一个叫做NSCoding的协议,声明文件如下:

#import <Foundation/Foundation.h>@interface MessageObject : NSObject <NSCoding>@property (nonatomic, copy)NSString * name;
@property (nonatomic, copy)NSString * time;
@property (nonatomic, copy)NSArray < NSString *> * pictures;@end

在实现文件中实现协议的两个方法:-encodeWithCoder:-initWithCoder:实现方法如下:

//进行编码的协议方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{//编码[aCoder encodeObject:self.name forKey:@"name"];[aCoder encodeObject:self.time forKey:@"time"];[aCoder encodeObject:self.pictures forKey:@"pictures"];
}//进行解码的协议方法
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
{//解码if (self = [super init]){self.name = [aDecoder decodeObjectForKey:@"name"];self.time = [aDecoder decodeObjectForKey:@"time"];self.pictures = [aDecoder decodeObjectForKey:@"pictures"];}