`
lizaochengwen
  • 浏览: 662618 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iPhone开发应用之Archiving NSCoder教程(1)

阅读更多
引用
iPhone开发应用中的Archiving NSCoder是本文要介绍的内容,举例我们创建保存一个nib文件,Interface Builder把对象写入到nib文件就是这样的arching过程,来看内容。

iPhone开发应用之Archiving NSCoder教程是本文要介绍的内容,一个面向对象程序在运行的时候,一般都创建了一个复杂的对象关系图,经常需要把这样一个复杂的对象关系图表示成字节流.这样的过程我们叫做Archiving 如图10.1,

这个字节流可以在网络中传送,也可以写入到文件中. 例如,我们创建保存一个nib文件,Interface Builder把对象写入到nib文件就是这样的arching过程(对于Java,这个过程叫serialization)。

而当从字节流中重新恢复对象关系图的过程叫做unarchive. 例如,当程序启动是,将会从nib文件中unarchive对象虽然对象包含成员变量和方法.但是只有成员变量和类名会被archive. 换句话说,data会被archive,而code不会. 所以,如果程序A archive对象,而程序B unarchive对象.那么程序A和B都要保证包含了class所连接的code. 举个例子,在nib文件中,你使用到了Appkit framework 的NSWindow和NSButton对象.那么如果我们的程序没有连接Appkit framework,那么我们就没有办法生成NSWindow和NSButton对象,因为archive中只包含了data,而没有code

有一个洗发水的广告是这样说得:"我告诉了我的两个朋友,而他们各自又告诉了自己的两个朋友,这样一传十,十传百.."寓意就是,你告诉了你的朋友,最后所有的人都开始使用这个洗发水了. 对象archiving的工作方式和这差不多. 你archiving一个root对象. 它archiving自己相关联的对象,那些相关联的对象也会archiving自己相关联的对象,依次类推,所有相关的对象都被archiving了

archiving由2步来完成. 1,我们需要告知我们的对象要怎么样来archive. 2. 我们需要激发archiving动作发生

Objective-C语言有一个机制叫protocol, 就像java中的interface一样. 一个protocol声明了一系列方法.但你的类实现一个protocol,那么就预定了,你的类需要实现protocol中声明的所有方法

NSCoder 和NSCoding

NSCoding是一个protocol. 如果你的类实现了NSCoding.那么就要实现这些方法

- (id)initWithCoder:(NSCoder *)coder; 
- (void)encodeWithCoder:(NSCoder *)coder;
NSCoder是archivie 字节流的抽象类.我们可以实现把数据写入一个coder,也可以从coder中读取我们写入的数据. 我们对象的方法initWithCoder:就是从一个coder从读取数据,然后把数据赋给成员变量. 方法encodeWithCoder: 则是把成员变量的值写入到coder中. 在这一章中,我们会在Person类中实现这两个方法

NSCoder是一个抽象类,我们不会直接使用它来创建对象. 相反,我们会使用从它继承来的子类. 也就是我们使用 NSKeyedUnarchiver类来从字节流中读取数据,而使用NSKeyedArchiver类来把对象写入到字节流

Encoding

NSCoder包含了很多方法, 不过大部分人会发现只会使用到其中很少的一部分. 下面是当要archivie数据时用到的一些常用方法

- (void)encodeObject:(id)anObject forKey:(NSString *)aKey
这个方法把anObject对象写入到coder中,并把它和aKey关联起来[下次使用aKey从coder中可以再把anObject读取出来] 这会是anObject的方法encodeWithCodr得到调用(还记得上面那个洗发水广告把.就是这样传下去的)

对于C的基本类型(如int float).NSCoder使用下面方法

- (void)encodeBool:(BOOL)boolv forKey:(NSString *)key 
- (void)encodeDouble:(double)realv forKey:(NSString *)key 
- (void)encodeFloat:(float)realv forKey:(NSString *)key 
- (void)encodeInt:(int)intv forKey:(NSString *)key
添加encoing方法到Person类中.

- (void)encodeWithCoder:(NSCoder *)coder 

    [super encodeWithCoder:coder]; 
    [coder encodeObject:personName forKey:@"personName"]; 
    [coder encodeFloat:expectedRaise forKey:@"expectedRaise"]; 
}
这里调用了父类的encodeWithCoder,使得父类有机会把自己的变量写入到coder中. 因此,类继承树中的类只会把自己的成员变量写入到coder-不会包含父类的成员变量

Decoding

从coder中decoding数据,我们使用这些方法

- (id)decodeObjectForKey:(NSString *)aKey 
- (BOOL)decodeBoolForKey:(NSString *)key 
- (double)decodeDoubleForKey:(NSString *)key 
- (float)decodeFloatForKey:(NSString *)key 
- (int)decodeIntForKey:(NSString *)key
如果因为某些原因, 字节流中没有和aKey关联的数据,那么我们会得到0值. 例如,对象没有把key foo 关联一个float数据写入coder,那么在使用foo key来读取这个float数据,coder会返回0.0 . 如果key foo关联的是一个对象数据[使用方法encodeWithCoder 写入],那么读取时coder返回nil

添加decoding到Person类中

- (id)initWithCoder:(NSCoder *)coder 

   [super init]; 
   personName = [[coder decodeObjectForKey:@"personName"] retain]; 
   expectedRaise = [coder decodeFloatForKey:@"expectedRaise"]; 
   return self; 
}
我们没有调用父类的initWithCoder, 那是因为NSObject没有实现它. 如过Person类的父类实现了NSCoding协议,那么这个方法应该这样写

- (id)initWithCoder:(NSCoder *)coder 

  [super initWithCoder:coder]; 
  personName = [[coder decodeObjectForKey:@"personName"] retain]; 
  expectedRaise = [coder decodeFloatForKey:@"expectedRaise"]; 
  return self; 
}
你可以会说"在第3章中, designated initializer会完成所有的init工作然后在调用父类的 designated initializer, 也就是说类的其他initializer 方法都会调用designated initializer,Person类有designated initializer- init. 可以这个新加入的initializer方法并没有调用init方法阿?" 不错, 你是对的, initWithCoer: 是这个规则的一个特例.

好了.我们实现了NSCoding协议的方法.现在让Person类实现NSCoding protocol. 我们来编辑Person.h文件.

@interface Person : NSObject <NSCoding> {
现在编译我们的工程. 你也可以运行程序看看.虽然Person类可以encode自己了.不过我们没有地方让它这么做.所以程序看上去没什么变化.
原文地址:http://mobile.51cto.com/iphone-282203.htm
分享到:
评论

相关推荐

    iphone开发基础教程源代码1

    这个压缩包包含了一系列与iPhone应用开发相关的项目,通过这些项目的源代码,我们可以深入理解并实践iPhone应用开发的基础技术。 首先,我们看到“03 Button Fun”,这是关于按钮使用的教程。在iOS开发中,UIButton...

    IPhone中文开发文档

    - **定义与背景**:“Cocoa”是苹果公司推出的一套用于Mac OS X和iOS应用开发的框架集合,它提供了一系列丰富的API(应用程序编程接口),使得开发者能够轻松构建高质量的应用程序。 - **学习起点**:本文档作为入门...

    iphone 开发学习基础NSUserDefaults

    在iOS开发中,`NSUserDefaults` 是一个至关重要的组件,它允许开发者存储并检索轻量级的用户偏好设置或应用状态数据。本教程针对初学者,将深入探讨`NSUserDefaults`的基本用法,包括如何设置、读取值以及如何持久化...

    iphone&ipad cocos2d游戏开发实战[PDF完整版]

    《iPhone&iPad cocos2d游戏开发实战》这本书深入浅出地介绍了在苹果移动设备上使用cocos2d框架进行游戏开发的技术与实践。cocos2d是一个强大的、开源的游戏开发库,尤其适合初学者和有一定编程基础的开发者,用于...

    NX二次开发UF-PATT-set-archiving 函数介绍

    NX二次开发UF_PATT_set_archiving 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士...

    服务器端应用开发,适合二次开发vs2015(c#)

    在服务器端应用开发中,C# 语言与Visual Studio 2015(VS2015)的组合是常用的选择,尤其对于那些需要进行二次开发的项目。C# 是一种面向对象的编程语言,由微软公司推出,设计用于.NET框架,支持多种编程范式,包括...

    NX二次开发UF-PATT-is-archiving-on 函数介绍

    NX二次开发UF_PATT_is_archiving_on 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...

    SAP 归档 Archiving

    ### SAP归档(Archiving)知识点详述 #### 一、企业数据归档简介 随着企业不断使用SAP R/3作为业务流程集成平台,大量的企业数据被存储在SAP R/3系统中。随着时间的推移,新的和更新的数据不断被录入系统,而旧...

    Enterprise Application Archiving、Test Data Management 和Data Masking管理SAP数据增长

    在IT行业中,管理企业应用程序中的数据增长是一个长期而复杂的挑战。尤其是对于SAP这类广泛使用的大型业务应用程序而言,随着业务的发展和各种新的实施与升级,数据量的激增成为一个日益严重的问题。本白皮书深入...

    SAP Data Archiving in SAP Retail

    ### SAP 数据归档在零售业中的应用 #### 概述 SAP 数据归档是针对 SAP 系统中大量累积的历史数据进行管理的一种方法。随着零售业务的发展,大量的销售、采购和其他交易数据不断积累,这些数据对系统的性能会产生...

    IOS_Swift_Archiving:基于Swift的IOS应用开发实践数据

    在iOS应用开发中,Swift是一种强大的编程语言,它为开发者提供了高效、安全和简洁的语法。本主题将深入探讨如何使用Swift进行iOS应用的数据存档(Archiving)实践,这是一项关键技能,尤其是在处理持久化数据时。...

    SAP Introduction to Data Archiving in SAP R3 Enterprise.pdf

    数据归档在SAP R/3企业环境中是一项关键的技术应用,它涉及到系统中不再频繁使用的数据的管理和存储。这些数据虽然不再活跃使用,但对于企业的历史记录和合规性需求来说仍然非常重要。归档过程通常包括将这些数据从...

    iphone 数据持久化的三个实例

    在iOS开发中,数据持久化是一项至关重要的技术,它使得应用程序的数据可以在用户关闭应用或设备重启后仍然保留。本文将通过三个具体的实例深入探讨iPhone上实现数据持久化的三种方法:属性列表、对象归档和SQLite3...

    详解iOS开发中app的归档以及偏好设置的存储方式

    在iOS开发中,数据存储是不可或缺的一部分,它涉及到如何持久化应用程序的数据,以便在用户退出应用后仍能保留这些信息。本篇文章将深入探讨iOS应用中的两种主要存储方式:归档(Archiving)和偏好设置(Preference ...

    使用Spring MVC3构建Web应用详细教程

    在本教程中,我们将深入探讨如何使用Spring MVC3框架构建Web应用程序。Spring MVC是一个轻量级的、模型-视图-控制器(MVC)架构,它使得开发人员能够有效地组织和处理Web请求,同时保持良好的代码结构和可维护性。 ...

    [confluence插件] better-content-archiving-for-confluence-9.2.0

    [confluence插件] better-content-archiving-for-confluence-9.2.0 [confluence插件] better-content-archiving-for-confluence-9.2.0 [confluence插件] better-content-archiving-for-confluence-9.2.0 [confluence...

    Dcmtk在PACS开发中的应用.zip

    标题"Dcmtk在PACS开发中的应用"暗示了本文档将深入探讨DCMTK(Digital Imaging and Communications in Medicine Toolkit)在Picture Archiving and Communication Systems(PACS)开发中的具体运用。PACS是一种用于...

Global site tag (gtag.js) - Google Analytics