- 浏览: 645039 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lizaochengwen:
网络请求碰到的中文乱码使用encodeURL吧- (NSStr ...
iPhone开发/iPad开发 中文乱码问题 -
hhb19900618:
还是没弄懂怎么解决了中文乱码? 正确代码能重写贴出吗
iPhone开发/iPad开发 中文乱码问题 -
zhengjj_2009:
我的理解是讲ipa文件解压缩之后再重新打包,已经破坏了签名,所 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
zhengjj_2009:
我参考你的“ 从ipa格式的母包生成其它渠道包的shell脚本 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
同一片天空:
问题果然解决了
iOS 搭建 XMPP实现环境
引用
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
发表评论
-
SOCK_STREAM和SOCK_DGRAM
2015-07-23 20:08 1573sock_stream 是有保障的(即能保证数据正确传送到 ... -
SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
2015-07-23 19:49 2011今天写程序时候,服务器端启动了,然后客户端总是连接不上,con ... -
htons()
2015-07-23 19:26 536在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺 ... -
使用symbolicatecrash分析crash文件
2015-03-10 11:32 1131原文 http://www.cnblogs.com/ning ... -
程序设计中的计算复用(Computational Reuse)
2015-02-10 10:18 613从斐波那契数列说起 ... -
didReceiveMemoryWarning
2015-02-09 16:11 494IPhone下每个app可用的内存是被限制的,如果一个app使 ... -
iOS开发中怎么响应内存警告
2015-02-09 16:08 610好的应用应该在系统内存警告情况下释放一些可以重新创建的资源。在 ... -
ASIHTTPRequest多次重复请求的问题
2014-12-17 14:34 594在一个车票订购的项目中,点击一次订购,却生成了2次订单,通过抓 ... -
从 CloudKit 看 BaaS 服务的趋势
2014-09-26 11:51 696从 6 月份 WWDC 苹果发布 ... -
ios编程--AVCapture编程理解
2014-09-26 11:03 8770、媒体采集的几个东西。这里所需要明白的是,在这个流程中,这里 ... -
NSURLProtocol
2014-09-25 10:42 7641、http://nshipster.com/nsurlpro ... -
关于iOS8的extension插件
2014-09-25 10:41 1224关于iOS8的extension插件,有兴趣的同学可以参考一下 ... -
【转】ios app在itunesConnect里面的几种状态
2014-08-05 10:34 1098Waiting for Upload (Yellow) Ap ... -
[转]iOS Dev (45) iOS图标与切片处理工具Prepo
2014-02-07 17:02 993iOS Dev (45) iOS图标与切片处理工具Prepo ... -
phoneGap开发IOS,JS调用IOS方法/phoneGap插件开发
2014-01-13 17:49 1211前沿 废话不说phoneGap是什么不多介绍,官方网站: h ... -
如何在IOS平台下搭建PhoneGap开发环境(PhoneGap2.5)
2014-01-13 15:23 704由于在下最近在做基于HTML5的跨平台移植,搭建环境的时候着实 ... -
xcode 4 制作静态库详解
2013-12-20 18:27 489最近在做Apple的IOS开发,有开发静态库的需求,本身IOS ... -
【翻译】ios教程-创建静态库
2013-12-20 18:19 3019作者:shede333 主页:htt ... -
封装自己的控件库:iPhone静态库的应用
2013-12-20 17:03 519由于iPhone 控件的极度匮乏和自定义组件在重用上的限制,在 ... -
iphone:使用NSFileManager取得目录下所有文件(遍历所有文件)
2013-11-18 17:56 831From:http://note.sdo.com/u/xiao ...
相关推荐
SAP Introduction to Data Archiving in SAP R3 Enterprise.pdf
本白皮书介绍应用程序ILM解决方案如何帮助您的IT组织更好地管理SAP系统中不断增长的数据量,并保护这些数据免遭未经授权的访问。通过阅读本白皮书,您将更好地了解到: • 管理SAP系统中数据量激增所面临的挑战 •...
什么是cocoa 起步 Objective—C语言 内存管理 Target/Action 辅助对象 Key—Value Coding ,Key—Value Observing NSArrayControler NsUndoManager Archiving Coredata基本原理 User Default
[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...
初学者的iOS开发代码,很有用途。 This is source code for Beginning iPhone Development: Exploring the iPhone SDK by Dave Mark and Jeff LaMarche. All of the projects from the book are contained here. ...
SAP起源于Systems Applications and Products in Data Processing。SAP既是公司名称,又是其产品——企业管理解决方案的软件名称。SAP是目前全世界排名第一的ERP软件。另有,计算机用语SAP,同时也是Stable ...
非常好个SAP归档文件,属于step-by-step的文档
SAP SD Archiving Customer Master
SAP Data Archiving in SAP Retail.pdf
IOS_Swift_Archiving
tigase-message-archiving.jar
藏经阁-NEXT Generation Archiving.pdf
藏经阁-Next Generation Archiving.pdf
藏经阁-Next Generation Archiving with.pdf
藏经阁-Next Generation Archiving with Hadoop.pdf
Enterprise Vault 8.0 for file system archiving 方案交流.ppt
How To Use the SAP ME Archiving Feature
简介 1 存档部署概述 1 安装和配置 MSMQ 4 安装 SQL Server 5 为存档服务安装文件 6 激活存档服务 9 在 Live Communications Server 上启用存档 16 管理和配置存档数据库的存储 21 配置全局存档设置和用户存档设置 ...
SWAT是一种用于存档网站并以简单方式显示档案的工具。 除了从网站上收集所有文件之外,SWAT还为TIFF文件生成每个页面的快照,并在METS文件中描述整个档案。
RIEGL地面激光扫描仪数据获取手册,riscan pro,应用于vz400 Introduction into RiSCAN PRO RiSCAN PRO is the companion software package to the RIEGL 3D laser imaging sensor of the LMS-Z series. It allows ...