(四十一)数据持久化的NSCoding实现 -实现普通对象的存取
来源:互联网 发布:吴亦凡 扒皮 知乎 编辑:程序博客网 时间:2024/06/07 22:04
NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法。
假设类Person有name和age两个属性,应该这样设置类:
.h文件:
#import <Foundation/Foundation.h>@interface Person : NSObject <NSCoding> // 注意要成为代理@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@end
.m文件
#import "Person.h"@implementation Person/** * 将对象归档的时候调用 * * @param aCoder 编码对象 */-(void)encodeWithCoder:(NSCoder *)aCoder{ //编码成员变量并存入相应的key [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeInt:_age forKey:@"age"]; }/** * 将对象从文件中读取的时候调用 * * @param aDecoder 解码对象 * * @return 读取到的对象 */- (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntForKey:@"age"]; } return self; }@end
Person *p = [[Person alloc] init]; p.name = @"jack"; p.age = 15; NSString *homePath = NSHomeDirectory(); NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; NSString *filePath = [docPath stringByAppendingPathComponent:@"test.data"]; //归档 [NSKeyedArchiver archiveRootObject:p toFile:filePath];
读取Person的方法:
NSString *homePath = NSHomeDirectory(); NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; NSString *filePath = [docPath stringByAppendingPathComponent:@"test.data"]; //读档(反归档) Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
一个细节:
假如有一个Student类继承子Person要存储,如果直接存储,只能调用父类的编码方法,因此子类的特有数据不能保存,应该再重新实现归档函数,但是直接调用父类的归档函数即可初始化原来的数据,再初始化自己的即可。
Tip:通过super调用父类方法可以省去原来属性的初始化。
假设Student多一个学号属性no:
@interface Student : Person@property (nonatomic, assign) int no;@end
#import "Student.h"@implementation Student-(void)encodeWithCoder:(NSCoder *)aCoder{ [super encodeWithCoder:aCoder]; [aCoder encodeInt:self.no forKey:@"no"]; }- (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super initWithCoder:aDecoder]) { _no = [aDecoder decodeIntForKey:@"no"]; } return self; }@end
0 0
- (四十一)数据持久化的NSCoding实现 -实现普通对象的存取
- iOS数据持久化---NSCoding
- Rtti实现对象的XML持久化
- Ado 实现C++对象的存取
- Hibernate实现Clob对象的存取
- ios-day12-04(ios开发中数据存储之NSKeyedArchiver归档(NSCoding)、普通对象如何归档、普通对象的子类如何归档)
- NSCoding归档数据持久化存储
- (四十)数据持久化存储的偏好设置实现
- 使用ADO实现BLOB数据的存取
- 使用ADO实现BLOB数据的存取
- NSUserDefaults实现小型数据的快速存取
- 对象的序列化NSObject<NSCoding>
- android+unity3D实现数据的存取(PlayerPrefs)
- android+unity3D实现数据的存取(PlayerPrefs)
- android+unity3D实现数据的存取(PlayerPrefs)
- iOS 数据存储 归档普通对象 NSCoding NSKeyedArchiver
- 【Objective-C】OC中自定义对象的归档基本概念和使用方法(实现NSCoding协议)
- 用DELPHI的RTTI实现对象的XML持久化
- java.sql.SQLException:Invalid value for getInt()-'zhangsan'
- Let the Balloon Rise
- PHP HttpClient模拟登陆
- 新站必须经过的几个百度时期
- 在安卓service中启动相机
- (四十一)数据持久化的NSCoding实现 -实现普通对象的存取
- 面向对象-基础
- 【Android如何禁止横竖屏切换】
- 提交订单后跳转回购物车的问题
- java.sql.SQLException:Can not issue data manipulation statements with executeQuery()
- 多线程同步-信号量(深入理解Semaphore)
- Java4Andriod 从零学起 ---learn8
- js单例模式
- [每天一个知识点]28-C语言-printf的格式符%p