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