在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化。使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们。只要在类中实现的每个属性都是标量(如int或float)或都是符合NSCoding协议的某个类的实例,就可以对该对象进行归档。由于大多数支持数据存储的Foundation和Cocoa Touch类都符合NSCoding,因此对于大多数类来说,归档相对而言比较容易实现。为了增加灵活性,在使用应用中,NSCoding协议最好与NSCopying协议一起使用,该协议运行复制对象。
1)符合NSCoding
NSCoding协议申明了两个方法,这两个方法都是必需的。一个方法将对象编码到归档中;另一个方法通过对归档解码来创建一个新的对象。这两个方法都传递一个NSCoder实例,我们继续根据以上一篇博文中的属性序列化中的例子为基础来说明。首先,我们创建一个FourLines类,该类的头文件如下代码如下,主要申明几个属性。
#import <Foundation/Foundation.h>
#define kField1Key @"field1"
#define kField2Key @"field2"
#define kField3Key @"field3"
#define kField4Key @"field4" @interface FourLines : NSObject<NSCoding,NSCopying>
{
NSString* field1;
NSString* field2;
NSString* field3;
NSString* field4;
} @property (nonatomic, retain) NSString* field1;
@property (nonatomic, retain) NSString* field2;
@property (nonatomic, retain) NSString* field3;
@property (nonatomic, retain) NSString* field4;
接下来,需要实现 NSCoding协议的第一个方法encodeWithCoder,该方法主要是对对象进行编码,代码如下:
// NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:field1 forKey:kField1Key];
[aCoder encodeObject:field2 forKey:kField2Key];
[aCoder encodeObject:field3 forKey:kField3Key];
[aCoder encodeObject:field4 forKey:kField4Key];
}
上面代码将对象的每个实例变量进行了编码,因此,在对归档数据进行操作时,我们需要对编码的对象进行解码,因此 NSCoding的另一个方法就是实现对对象的解码功能,代码如下:
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init])
{
self.field1 = [aDecoder decodeObjectForKey:kField1Key];
self.field2 = [aDecoder decodeObjectForKey:kField2Key];
self.field3 = [aDecoder decodeObjectForKey:kField3Key];
self.field4 = [aDecoder decodeObjectForKey:kField4Key];
}
return self;
}
2)实现NSCopying
实现了NSCoding协议的两个方法,接下来我们还要实现NSCopying协议中的copyWithZone方法,该方法可用于复制对象,与NSCoding中的initWithCoder很相似,所有需要做的只是创建一个同类对象,然后将该新实例的所有属性都设置为与该对象属性相同的只。该方法的代码如下:
// NSCopying
- (id)copyWithZone:(NSZone *)zone
{
FourLines* copy = [[[self class] allocWithZone:zone]init];
field1 = [self.field1 copy];
field2 = [self.field2 copy];
field3 = [self.field3 copy];
field4 = [self.field4 copy];
return copy;
}
3)对数据对象进行归档
从符合NSCoding的一个或多个对象创建归档相对比较容易,首先创建一个NSMutableData实例,用于包含编码的数据;然后创建一个NSKeyedArchiver实例,用于将对象归档到NSMutableData实例中。在这两个对象创建之后,就直接告知归档程序,将NSMutableData写入文件系统。本文在程序即将退出时,对数据进行归档,代码如下:
- (void)applicationWillTerminate:(NSNotification *)notification
{ FourLines* fourLines = [[FourLines alloc]init];
fourLines.field1 = field1.text;
fourLines.field2 = field2.text;
fourLines.field3 = field3.text;
fourLines.field4 = field4.text; NSMutableData* data = [[NSMutableData alloc]init];
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:fourLines forKey:kDataKey];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
}
4)从归档文件中加载数据
在程序重新启动或需要再次加载归档对象时,我们只要创建一个NSData实例,并创建一个NSKeyedUnarchiver对象对数据进行解码,该代码在viewDidLoad函数中实现,代码如下:
- (void)viewDidLoad
{
// Do any additional setup after loading the view, typically from a nib.
NSString* filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
NSData* data = [[NSMutableData alloc]initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
FourLines* fourLines = [unarchiver decodeObjectForKey:kDataKey];
[unarchiver finishDecoding];
field1.text = fourLines.field1;
field2.text = fourLines.field2;
field3.text = fourLines.field3;
field4.text = fourLines.field4;
} UIApplication* app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app]; [super viewDidLoad];
}
程序实现的功能与上一篇博文相同,实际上,这两个程序大致相似,改动的地方并不多。那么属性列表和对象归档又有什么优势呢?举个简单的例子:实现比较int , char, float ,double两个变量的大小,用C语言要些4个函数,在C++中有函数模板,对于实现类似功能的函数,通过模板实现,只需要一个函数就可以完成相同功能,模板函数不仅减少了代码编写量,而且提高了程序的可维护性,函数模板就类似这里的对象归档。
该实例的代码可以通过下面的连接下载:http://download.csdn.net/detail/kezunhai/6199397
iphone开发中数据持久化之——模型对象归档(二)的更多相关文章
-
iphone开发中数据持久化之——属性列表序列化(一)
数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式.本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式,分别是属性列表序列号.对象归档化以及 ...
-
iphone开发中数据持久化之——嵌入式SQLite(三)
前两篇分别讨论了使用属性列表的数据持久化.使用对象归档的数据持久化,本文将讨论第三个实现数据持久化的方法---嵌入式SQL数据库SQLite3.SQLite3在存储和检索大量数据方面非常有效.它还能够 ...
-
IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
-
objective C中数据持久化方式1--对象归档
第一.数据持久化的方式: NSKeyedArchiver--对象归档 属性列表化(NSArray.NSDictionary.NSUserDefault) SQlite数据库.CoreData数据库 其 ...
-
iOS开发中数据持久化
使用几个小例子分别实现 归档NSKeyedArchiver.NSUserDefaults.plist文件数据存储,简单直观.代码地址
-
iOS开发——数据持久化Swift篇&;模型对象归档
模型对象归档 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...
-
解析iOS开发中的FirstResponder第一响应对象
1. UIResonder 对于C#里所有的控件(例如TextBox),都继承于Control类.而Control类的继承关系如下: 代码如下: System.Object System.Marsha ...
-
iPhone开发中从一个视图跳到另一个视图有三种方法:
iPhone开发中从一个视图跳到另一个视图有三种方法: 1.self.view addSubView:view .self.window addSubView,需要注意的是,这个方法只是把页面加在 ...
-
iphone 开发中使用zbar时遇到的几个典型问题解决方法。
iphone 开发中使用zbar时遇到的几个典型问题解决方法. 在近期的一个ios项目中使用到了一个二维码扫描库(Qrcode)--ZBar, 期间遇到2个问题. 1. zbar下载后使用其l ...
随机推荐
- js中原型继承的三种方式
-
JavaScript设计模式——工厂模式
工厂模式:是一种实现“工厂”概念的面上对象设计模式.实质是定义一个创建对象的接口,但是让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.创建一个对象常常需要复杂的过程,所以不 ...
-
WDCP安装常用组件(memcache、mysqli、PDO_MYSQL、mysql innodb、libmcrypt、php zip)的方法
为有更好的性能,也为更简洁的系统,一些不是常用或不是基本的功能,都将做为可选的安装组件需要用到的就安装 注意:如果安装时遇到 ./configure: Permission denied提示,很有可能 ...
-
js知识
行为=事件+由该事件触发的动作 常用事件:onXxx onLoad 打开网页事件 onUnLoad 关闭事件 onClick 单击事件 onChange ...
-
WordPress RokNewsPager插件‘thumb.php’多个安全漏洞
漏洞名称: WordPress RokNewsPager插件‘thumb.php’多个安全漏洞 CNNVD编号: CNNVD-201309-369 发布时间: 2013-09-24 更新时间: 201 ...
- 获取手机root的方法
-
SSM-SpringMVC-25:SpringMVC异常*之自定义异常解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上篇博客相信大家也看到了,自定义异常,用了SimpleMappingExceptionResolver这个解析 ...
-
Xshell配合Screen之ssh会话永不断开
[转]Xshell配合Screen之ssh会话永不断开 - 海运的博客
-
1、Filebeat概述
Filebeat是一个轻量级的日志托运工具,用于转发和集中日志数据. Filebeat作为代理安装在服务器上,监控指定的日志文件或目录,收集日志事件,并将它们转发到Elasticsearch或Logs ...
-
.NET 常用ORM之SubSonic
一.SubSonic简单介绍 SubSonic是一个类似Rails的开源.NET项目.你可以把它看作是一把瑞士军刀,它可以用来构建Website和通过ORM方式来访问数据.Rob Conery和Eri ...