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
原文地址:https://www.cnblogs.com/Angelone/p/4360697.html