/*
iOS序列化,将对象转成二进制,保存到本地
*/

定义一个对象,让它实现NSCoding协议,保证对象的编码和解码,person有三个属性

@interface Person : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, copy) NSString *gender;
@end

#import "Person.h"
#import <objc/message.h>

@implementation Person
//编码
- (void)encodeWithCoder:(NSCoder *)aCoder
{
  /*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
  [aCoder encodeObject:_name forKey:@"name"];
  [aCoder encodeInt:_age forKey:@"age"];
  [aCoder encodeObject:_gender forKey:@"gender"];
  */

  /*利用runtime*/
  unsigned int count = 0;
  Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
  for (int i = 0; i < count; i ++) {
    Ivar ivar = ivars[i]; //得到第i个属性
    const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
    NSString *key = [NSString stringWithUTF8String:paramName];
    //得到属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
    id value = [self valueForKey:key];
    [aCoder encodeObject:value forKey:key]; //把对应的值设置进去
  }
}
//解码
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
  self = [super init];
  if (self) {

    /*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
    _name = [aDecoder decodeObjectForKey:@"name"];
    _age = [aDecoder decodeIntForKey:@"age"];
    _gender = [aDecoder decodeObjectForKey:@"gender"];
    */

    /*利用runtime*/
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
    for (int i = 0; i < count; i ++) {
      Ivar ivar = ivars[i]; //得到第i个属性
      const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
      NSString *key = [NSString stringWithUTF8String:paramName];
      //将key对应的属性进行解码
      id value = [aDecoder decodeObjectForKey:key];
      //设置属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
      [self setValue:value forKey:key];
    }
  }
  return self;
}

最新文章

  1. C#中的委托与事件并存的理由
  2. css 3 动画
  3. Portal.MVC —— nopcommerce的简化版
  4. iOS解析数据时Error=3840
  5. opencv统计二值图黑白像素个数
  6. [firefox]在Debian7及其衍生版下安装firefox
  7. Hive 实战(2)--hive分区分桶实战
  8. Observer模式
  9. php基础33:正则匹配-perl
  10. MVC4.0 实现单一Action返回多种结果
  11. [Excel操作]Microsoft Office Excel 不能访问文件
  12. MVC-Model数据注解(一)-系统(DataAnnotations)
  13. statfs函数说明
  14. JavaScript看书笔记01
  15. 【http转https】其之三 IIS_URL重写_http重定向到https
  16. AtCoder Grand Contest 019
  17. BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
  18. Redis须知重点
  19. 搭建好lamp,部署owncloud。
  20. 回顾JavsScript对象的克隆

热门文章

  1. bitShark对Android版本的支持
  2. Java RandomAccessFile类
  3. jar word 模板操作比较好用的工具
  4. Android gradle 相关配置
  5. 记一次痛苦的ubuntu配置Go环境 -- Ubuntu &amp; Go
  6. android与服务器交互总结(json,post,xUtils,Volley)
  7. 【层次查询】Hierarchical Queries之亲兄弟间的排序(ORDER SIBLINGS BY)
  8. java设计模式之-建造者模式
  9. 《图论》——广度优先遍历算法(BFS)
  10. asp .net 为图片添加文字水印(内包含有加图片水印的方法) .