zoukankan      html  css  js  c++  java
  • Copy和NSMutableCopy 归档和反归档

    Person.h文件

    1 #import <Foundation/Foundation.h>
    2 
    3 @interface Person : NSObject <NSCopying,NSMutableCopying,NSCoding>
    4 
    5 @property (strong,nonatomic)NSMutableString *name;
    6 
    7 @end

    Person.m文件

    #import "Person.h"
    
    @implementation Person
    
    //重写copy的方法
    - (id)copyWithZone:(NSZone *)zone
    {
        Person *person = [[[self class] alloc] init];
        person.name = self.name;
        return person;
    }
    
    - (id)mutableCopyWithZone:(NSZone *)zone
    {
        Person *person = [[[self class] alloc] init];
        person.name = [self.name mutableCopy];
        return person;
    }
    
    //归档
    - (void)encodeWithCoder:(NSCoder *)aCoder
    {
        //把属性依次归档
        [aCoder encodeObject:self.name forKey:@"name"];
        
    }
    //解档
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        return self;
    }
    
    
    @end

    ViewController.m文件

    #import "ViewController.h"
    #import "Person.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //不管之前是可变的还是不可变的,只要加了copy就是不可变的,加了mutableCopy的都是可变的
        // Do any additional setup after loading the view, typically from a nib.
        NSArray *array = @[@"a",@"b"];
        NSMutableArray *array2 = [array copy];
        NSMutableArray *array3 = [array mutableCopy];
        [array3 addObject:@"c"];//array2不可以
        
        
        NSMutableArray *mArray = [NSMutableArray arrayWithObject:@"a"];
        array2 = [mArray copy];
        array3 = [mArray mutableCopy];
        [array3 addObject:@"c"];//array2不可以
        
        
        //person是要拷贝的对象
        Person *person = [[Person alloc] init];
        person.name = [NSMutableString stringWithString:@"西门吹雪"];
        //person2是浅拷贝的结果,person3是深拷贝的结果
        Person *person2 = [person copy];
        Person *person3 = [person mutableCopy];
        //修改源对象的值
        [person.name setString:@"叶孤城"];//浅拷贝
        NSLog(@"%@",person2.name);
        //person2中name也随之变化,person3不变
        NSLog(@"%@",person3.name);
        
        
        //归档
        NSString *str = @"司空摘星";
        NSString *str2 = @"陆小凤";
        //归档
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
        //解档
        str = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        
        
        //多文件归档
        NSMutableData *mData = [NSMutableData data];
        NSKeyedArchiver *arch = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
        //归档对象
        [arch encodeObject:str forKey:@"name1"];
        [arch encodeObject:str2 forKey:@"name2"];
        [arch encodeObject:person forKey:@"person"];//不能实现,要成功必须加协议NSCoding
        [arch finishEncoding];//真正的去归档,一定要写,才能归档成功
        //多文件解档
        NSKeyedUnarchiver *unarch = [[NSKeyedUnarchiver alloc] initForReadingWithData:mData];
        //取对象
        str = [unarch decodeObjectForKey:@"name1"];
        str2 = [unarch decodeObjectForKey:@"name2"];
        [unarch finishDecoding];//解档完成
    }
    
    
    @end
  • 相关阅读:
    QT visual stuido 集成插件不能打开ui文件的原因
    KLSudoku 1.2 数独游戏软件发布
    QT for linux 的错误 undefined reference to 'FcFreeTypeQueryFace' 的解决方法
    tp3.2源码解析——入口文件
    关于php调用.net的web service 踩过的坑
    CentOS7 LNMP+phpmyadmin环境搭建(二、LNMP环境搭建)
    CentOS7 LNMP+phpmyadmin环境搭建(一、虚拟机及centos7安装)
    php无限分类
    php的文件引用
    CentOS7 LNMP+phpmyadmin环境搭建(三、安装phpmyadmin)
  • 原文地址:https://www.cnblogs.com/Angelone/p/4360697.html
Copyright © 2011-2022 走看看