NSCoding
在IOS的开发中,小数据量的持久化都用NSUserDefaults来实现,但是NSUserDefaults只能保存NSString, NSNumber, NSDate, NSArray, NSDictionary这些数据类型,但大多时候,我们会将一个对象实体做持久化的保存,由于不是大批量的数据,不会用到sqlite,那么这个时候NSUserDefaults会是很好的选择,其实对象类型可以通过NSCoding的委托方法来实现的。
- View Code //
- // UserEntity.m
- // NSCodingDemo
- //
- // Created by on 11-5-20.
- // Copyright 2011 , Inc. All rights reserved.
- //
- #import "UserEntity.h"
- #import "AddressEntity.h"
- #define SAMPLEDATA_KEY_USERNAME (@"userName")
- #define SAMPLEDATA_KEY_GENDER (@"gender")
- #define SAMPLEDATA_KEY_AGE (@"age")
- #define k_FRIENDS (@"frinds")
- #define k_ADDRESS (@"address")
- #define k_userEntity_addresses (@"addresses")
- @implementation UserEntity
- @synthesize userName = _userName;
- @synthesize gender = _gender;
- @synthesize age = _age;
- @synthesize friends = _friends;
- @synthesize address = _address;
- @synthesize addresses = _addresses;
- -(void)dealloc
- {
- [self.userName release];
- [self.friends release];
- [self.address release];
- [self.addresses release];
- [super dealloc];
- }
- - (void)encodeWithCoder:(NSCoder*)coder
- {
- [coder encodeObject:self.userName forKey:SAMPLEDATA_KEY_USERNAME];
- [coder encodeInt:self.age forKey:SAMPLEDATA_KEY_AGE];
- [coder encodeBool:self.gender forKey:SAMPLEDATA_KEY_GENDER];
- [coder encodeObject:self.friends forKey:k_FRIENDS];
- [coder encodeObject:self.address forKey:k_ADDRESS];
- [coder encodeObject:self.addresses forKey:k_userEntity_addresses];
- }
- - (id)initWithCoder:(NSCoder*)decoder
- {
- if (self = [super init])
- {
- if (decoder == nil)
- {
- return self;
- }
- self.userName = [decoder decodeObjectForKey:SAMPLEDATA_KEY_USERNAME];
- self.gender = [decoder decodeBoolForKey:SAMPLEDATA_KEY_GENDER];
- self.age = [decoder decodeIntForKey:SAMPLEDATA_KEY_AGE];
- self.friends = [decoder decodeObjectForKey:k_FRIENDS];
- self.address = [decoder decodeObjectForKey:k_ADDRESS];
- self.addresses = [decoder decodeObjectForKey: k_userEntity_addresses];
- }
- return self;
- }
- @end
- View Code //
- // AddressEntity.m
- // NSCodingDemo
- //
- // Created by on 11-5-20.
- // Copyright 2011 , Inc. All rights reserved.
- //
- #import "AddressEntity.h"
- #define k_Id (@"id")
- #define k_AddresEntity_address (@"addrss")
- @implementation AddressEntity
- @synthesize Id, address;
- -(void)dealloc
- {
- [self.address release];
- [super dealloc];
- }
- - (NSString *)description
- {
- return [NSString stringWithFormat:@"id :%d address: %@" , self.Id, self.address];
- }
- - (void)encodeWithCoder:(NSCoder*)coder
- {
- [coder encodeObject:self.address forKey:k_AddresEntity_address];
- [coder encodeInt:self.Id forKey:k_Id];
- }
- - (id)initWithCoder:(NSCoder*)decoder
- {
- if (self = [super init])
- {
- if (decoder == nil)
- {
- return self;
- }
- self.address = [decoder decodeObjectForKey:k_AddresEntity_address];
- self.Id = [decoder decodeIntForKey:k_Id];
- }
- return self;
- }
- @end
- View Code -(IBAction)write:(id)sender
- {
- //get document path
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentsDirectory = [paths objectAtIndex:0];
- NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
- NSMutableData *data = [[[NSMutableData alloc] init] autorelease];
- NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
- UserEntity *userEntity = [[[UserEntity alloc] init] autorelease];
- userEntity.age = 18;
- userEntity.gender = NO;
- userEntity.userName = @"add";
- NSArray *friends = [[NSArray alloc] initWithObjects:@"ac", @"2", @"3", @"4", nil];
- userEntity.friends = friends;
- AddressEntity *address = [[[AddressEntity alloc] init] autorelease];
- address.Id = 1;
- address.address = @"china";
- userEntity.address = address;
- AddressEntity *address2 = [[[AddressEntity alloc] init] autorelease];
- address2.Id = 2;
- address2.address = @"china2";
- AddressEntity *address3 = [[[AddressEntity alloc] init] autorelease];
- address3.Id = 3;
- address3.address = @"china3";
- NSArray *addresses = [[NSArray alloc] initWithObjects:address2, address3 , nil];
- userEntity.addresses = addresses;
- [archiver encodeObject:userEntity forKey:@"KEY"];
- [archiver finishEncoding];
- BOOL success = [data writeToFile:filePath atomically:YES];
- }
- -(IBAction)read:(id)sender
- {
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentsDirectory = [paths objectAtIndex:0];
- NSString *filePath = [documentsDirectory stringByAppendingPathComponent:k_FILE_NAME];
- NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
- NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
- UserEntity *userEntity = [unArchiver decodeObjectForKey:@"KEY"];
- NSLog(@"name is %@ , friend %@ address :%@ , addresses is :%@", userEntity.userName , userEntity.friends , userEntity.address, userEntity.addresses);
- }
NSCoding的更多相关文章
- iOS 数据序列化,NSCoding, NSCoder
iOS可以利用NSKeyedArchiver类将对象序列化成NSData存储在磁盘上,但前提是该对象所属的类必须遵从NSCoding协议. NSCoding协议包含两个方法,要序列化的类必须实现它们 ...
- Objective-C NSData与实现NSCoding协议进行序列化和反序列化
1.NSData NSData是Objective-C语言中数据的基本类型,其成分可以理解为字节指针和长度的封装的类,来看看源代码 @interface NSData : NSObject <N ...
- [转载]iOS 归档操作 NSCoding
最近一个项目需要保存到本地文件,想用plist,但是发现很多内容是自定义的,于是只能自己归档接档.不难,找了一篇范文大家保存一下,方便以后学习使用. 转自:http://mobile.51cto.co ...
- NSCoding归档
大家都知道ios中数据持久化的方式有plist sqlite coredata nscoding 而nscoding不需要关心模型属性有多少个,是什么类型,不需要定义归档文件的规则. 下面给个类大家用 ...
- IOS开发-- NScoding 序列化
开篇 1到底这个序列化有啥作用? 面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中(来源于某教 ...
- ios 沙盒 NSCoding(相当于JAVA对象序列化) 归档 数据存储
通过NSCoding能实现像JAVA一样能够实现对象的序列化,可以保存对象到文件里. NSCoding 跟其他存储方式略有不同,他可以存储对象 对象存储的条件是: 对象需要遵守 NSCoding 协议 ...
- iOS开发——OC篇&协议篇/NSCoder/NSCoding/NSCoping
协议篇/NSCoder/NSCoding/NSCoping 协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(f ...
- Runtime之NSCoding的自动归档、接档
为什么要有Runtime的NSCoding的自动归档.接档 大家所熟知的方法 //归档方法 - (void)encodeWithCoder:(NSCoder *)aCoder { //当学生被归档,学 ...
- (四十一)数据持久化的NSCoding实现 -实现普通对象的存取
NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法. 假设类Person有name和age两个属性,应该这样设置类: .h文件: #import < ...
- Runtime应用(三)实现NSCoding的自动归档和自动解档
当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法.例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NS ...
随机推荐
- 使用SourceTree 来管理 Gitcafe 的Pages 发布Blog!
有个好爹的 SourceTree 是来自 JIRA 的娘家 Bitbucket 的新东家 ATLASSIAN.com 一家成功的,对敏捷软件工程拥有全栈式支持的商业公司, 所推出的 MAC 专用, S ...
- 【kotlin】kotlin中List中添加List怎么操作
如题,List集合添加一个List集合怎么操作 如上,现在有了List<A>,A类中有个字段List<B>, 新创建一个List<B>,想把LIst<A> ...
- linxu下查看进程的线程方法;如何知道某个进程或者线程运行在哪个CPU上?
1.top -H -p <pid> ; top -H 在top命令后,按H键:或者top -H 2.ps -T -p <pid> “-T”选项可以开启线程查看 3.htop, ...
- 30 分钟编写一个 Flask 应用
Flask 是一种很赞的Python web框架.它极小,简单,最棒的是它很容易学. 今天我来带你搭建你的第一个Flask web应用!和官方教程 一样,你将搭建你自己的微博客系统:Flaskr.和官 ...
- java开始到熟悉60
本次主题:多维数组 1,多维数组的初始话有三种:默认初始化.静态初始化.动态初始化. 这里只讲解静态初始化: 这里以二位数组为例,实际应用中,一维用得最多,二维次之,三维以及三维以上几乎很少使用,而且 ...
- MySQL中insert ignore into, on duplicate key update,replace into,insert … select … where not exist的一些用法总结
在MySQL中进行条件插入数据时,可能会用到以下语句,现小结一下.我们先建一个简单的表来作为测试: CREATE TABLE `books` ( `id` ) NOT NULL AUTO_INCREM ...
- UIAutomation使用測试入门
自己主动化測试的优点: 1.自己主动化能够自己主动測试,不须要人的干预.同一时候还能够不断地反复某一个动作. 2.自己主动化測试在添加了新的功能之后.还能够回归到原理的功能,使其原来的功能不会受到影响 ...
- typedef和#define的差别——————【Badboy】
typedef 和#define 都经常使用来定义一个标识符及keyword的别名.但他们之间有关键的差别. typedef 是语言编译过程的一部分; #define是宏定义语句,它本身并不在编译过程 ...
- 依据iPhone6设计稿动态计算rem值
rem 单位在做移动端的h5开发的时候是最常常使用的单位. 为解决自适应的问题.我们须要动态的给文档的更节点加入font-size 值.使用mediaquery 能够解决问题,可是每个文件都引用一大串 ...
- iOS开发之---判断是否是手机号
iOS开发之---判断是否是手机号