• 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
  • 相关阅读:
    String
    Xposed源码编译踩坑实录
    Hello 博客园
    HDU 1430 关系映射 + 打表 .
    HDU 1430 关系映射 + 打表 .
    hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
    hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
    hdu 1044 BFS(压缩图)+DFS
    hdu 1044 BFS(压缩图)+DFS
    hdu3338 最大流
  • 原文地址:https://www.cnblogs.com/Angelone/p/4360697.html
Copyright © 2020-2023  润新知