年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2012|回复: 0

iOS开发中自定义对象的归档

[复制链接]
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

    发表于 2014-11-6 09:46:11 | 显示全部楼层 |阅读模式
    1、在iOS开发中,对象的归档存储是最为常用一种操作,我们经常需要将对象保存到本地,后续再从本地读取调用,比如说游戏中的存档操作。
    2、常规类型如字符串、数组、字典、图片等对象的归档系统都有对应的方法,使得归档变得简单,那么自定义的对象如何归档呢?
    3、实现原理与常规类型归档类似,唯一不同的是自定义对象如果需要归档则必须遵守<NSCoding>协议,并实现该协议中的两个方法:
    1. #pragma mark 自定义对象解档必须实现方法
    2. - (id)initWithCoder:(NSCoder *)aDecoder
    3. #pragma mark 自定义对象归档必须实现方法
    4. - (void)encodeWithCoder:(NSCoder *)aCoder
    复制代码
    4、举例说明,现自定义一个Person类,成员变量有name、age、phone,现需要对该对象进行归档,对象该如何写:
    4.1、Person.h
    1. #import <Foundation/Foundation.h>
    2. @interface Person : NSObject <NSCoding>
    3. @property (nonatomic, strong)   NSString    *name;
    4. @property (nonatomic, assign)   NSInteger   age;
    5. @property (nonatomic, strong)   NSString    *phone;
    6. - (id)initWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone;
    7. @end
    复制代码
    4.2、Person.m
    1. #import "Person.h"
    2. @implementation Person
    3. #pragma mark 工厂化初始方法
    4. - (id)initWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone
    5. {
    6.     if (self = [super init]){
    7.         _name = name;
    8.         _age = age;
    9.         _phone = phone;
    10.     }
    11.     return self;
    12. }
    13. #pragma mark 自定义对象解档必须实现方法
    14. - (id)initWithCoder:(NSCoder *)aDecoder
    15. {
    16.     // init方法正规写法,如果父类实现了initWithCode:方法,则写成if (self = [super initWithCode:aDecode]){
    17.     if (self = [super init]) {
    18.         // 各成员变量解档规划,各key是由归档时自定义的
    19.         self.name = [aDecoder decodeObjectForKey:@"name"];
    20.         self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue];
    21.         self.phone = [aDecoder decodeObjectForKey:@"phone"];
    22.     }
    23.     return self;
    24. }
    25. #pragma mark 自定义对象归档必须实现方法
    26. - (void)encodeWithCoder:(NSCoder *)aCoder
    27. {
    28.     // 自定义各成员变量归档规则,即自定义各key,与解档时相对应
    29.     [aCoder encodeObject:self.name forKey:@"name"];
    30.     [aCoder encodeObject:@(self.age) forKey:@"age"];
    31.     [aCoder encodeObject:self.phone forKey:@"phone"];
    32. }
    33. @end
    复制代码
    5、具体归档操作参考:
    常规对象的归档操作:http://www.yusian.com/bbs/thread-7979-1-1.html
    iOS多对象归档操作:http://www.yusian.com/bbs/thread-7982-1-1.html
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-12-22 17:34 , Processed in 0.054520 second(s), 23 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表