zoukankan      html  css  js  c++  java
  • 用NSCoding协议完成“编码/解码”操作-Object-C

    原文:http://blog.sina.com.cn/s/blog_7b9d64af01019kk5.html

    Object-C中我们可以对 NSDate, NSNumber, NSString, NSArray, or NSDictionary对象进行“编码/解码”的操作。

     
    但是,当我们对自己定义的对象进行“编码/解码”操作时,却需要实现NSCoding协议的相关方法来告诉程序如何来“编码/解码”我们自己的对象!
    NSCoding协议的方法:

    - (void)encodeWithCoder:(NSCoder *)aCoder;

    - (id)initWithCoder:(NSCoder *)aDecoder;

     
    那么,我们就对类实现“编码/解码”协议:
    在AddressCard.h中,申明实现NSCoding协议:

    @interface AddressCard : NSObject<NSCopying,NSCoding>

     
    在AddressCard.m中,实现NSCoding协议的编码/解码 方法:

    #pragma mark- NSCoding

    - (void)encodeWithCoder:(NSCoder *)aCoder{

        [aCoder encodeObject:self.name forKey:@"AddressCard_name"];

        [aCoder encodeObject:self.email forKey:@"AddressCard_email"];

        [aCoder encodeInt32:self.salary forKey:@"AddressCard_salary"];

    }

    - (id)initWithCoder:(NSCoder *)aDecoder{

        _name=[[aDecoder decodeObjectForKey:@"AddressCard_name"] retain];

        _email=[[aDecoder decodeObjectForKey:@"AddressCard_email"] retain];

        _salary=[aDecoder decodeInt32ForKey:@"AddressCard_salary"];

        return self;

    }

    这样,我们就能够归档自己定义的类对象。
     

    NSString *filePhyName=[filePath stringByAppendingPathComponent:@"ObjectFile"];

        BOOL isSuccess=NO;

        isSuccess= [NSKeyedArchiver archiveRootObject:objArray toFile:filePhyName];

        if (isSuccess) {

            NSLog(@"Success");

        }else{

            NSLog(@"False");

        }

        

        // 反归档

        NSMutableArray *myObj=[NSKeyedUnarchiver unarchiveObjectWithFile:filePhyName];

        for (AddressCard *theCard in myObj) {

            [theCard print];

        }

     
     
    从输出可以看到,归档成功!
    归档需要注意的是:
    1.同一个对象属性,编码/解码的key要相同!
    2.每一种基本数据类型,都有一个相应的编码/解码方法。
    如:encodeObject方法与decodeObjectForKey方法,是成对出现的。
    3.如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议。
     
     
    --------------------------------------------------------------
    还有一个

    使用NSSecureCoding协议进行对象编解码

    原文:http://blog.jobbole.com/67655/

  • 相关阅读:
    [读书笔记]SQLSERVER企业级平台管理实践读书笔记--从等待事件判断性能瓶颈
    Docker machine学习
    不同数据库连接字符串的网站
    Windows 可以操纵linux内文件,与本地一致的工具
    OpenSSH 安全漏洞(CVE-2021-28041)修复(升级OpenSSH至最新版本(8.6p1))
    PostgreSQL
    firewalld添加/删除服务service,端口port
    PostgreSQL 序列操作
    PostgreSQL/pgsql 为表添加列/ 判断列存不存在再添加列
    Windows10中Power Shell(x64)出现“无法加载 PSReadline 模块。控制台在未使用 PSReadline 的情况下运行。”的解决办法
  • 原文地址:https://www.cnblogs.com/whqios/p/4549421.html
Copyright © 2011-2022 走看看