TA的每日心情 | 汗 2024-10-15 10:05 |
---|
签到天数: 372 天 [LV.9]以坛为家II
|
1、在iOS开发中,对象的归档存储是最为常用一种操作,我们经常需要将对象保存到本地,后续再从本地读取调用,比如说游戏中的存档操作。
2、常规类型如字符串、数组、字典、图片等对象的归档系统都有对应的方法,使得归档变得简单,那么自定义的对象如何归档呢?
3、实现原理与常规类型归档类似,唯一不同的是自定义对象如果需要归档则必须遵守<NSCoding>协议,并实现该协议中的两个方法:- #pragma mark 自定义对象解档必须实现方法
- - (id)initWithCoder:(NSCoder *)aDecoder
- #pragma mark 自定义对象归档必须实现方法
- - (void)encodeWithCoder:(NSCoder *)aCoder
复制代码 4、举例说明,现自定义一个Person类,成员变量有name、age、phone,现需要对该对象进行归档,对象该如何写:
4.1、Person.h- #import <Foundation/Foundation.h>
- @interface Person : NSObject <NSCoding>
- @property (nonatomic, strong) NSString *name;
- @property (nonatomic, assign) NSInteger age;
- @property (nonatomic, strong) NSString *phone;
- - (id)initWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone;
- @end
复制代码 4.2、Person.m- #import "Person.h"
- @implementation Person
- #pragma mark 工厂化初始方法
- - (id)initWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone
- {
- if (self = [super init]){
- _name = name;
- _age = age;
- _phone = phone;
- }
- return self;
- }
- #pragma mark 自定义对象解档必须实现方法
- - (id)initWithCoder:(NSCoder *)aDecoder
- {
- // init方法正规写法,如果父类实现了initWithCode:方法,则写成if (self = [super initWithCode:aDecode]){
- if (self = [super init]) {
- // 各成员变量解档规划,各key是由归档时自定义的
- self.name = [aDecoder decodeObjectForKey:@"name"];
- self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue];
- self.phone = [aDecoder decodeObjectForKey:@"phone"];
- }
- return self;
- }
- #pragma mark 自定义对象归档必须实现方法
- - (void)encodeWithCoder:(NSCoder *)aCoder
- {
- // 自定义各成员变量归档规则,即自定义各key,与解档时相对应
- [aCoder encodeObject:self.name forKey:@"name"];
- [aCoder encodeObject:@(self.age) forKey:@"age"];
- [aCoder encodeObject:self.phone forKey:@"phone"];
- }
- @end
复制代码 5、具体归档操作参考:
常规对象的归档操作:http://www.yusian.com/bbs/thread-7979-1-1.html
iOS多对象归档操作:http://www.yusian.com/bbs/thread-7982-1-1.html
|
|