IOS学习笔记二十四(NSData归档多个对象和归档对象实现深复制)
1、NSData归档多个对象
一、之前我写的学习笔记都是归档一个对象,如果需要归档多个对象我们需要借助NSData
二、步骤
1)、NSMutableData作为参数,构建 NSKeyedArchiver对象
2)、调用NSKeyedArchiver的encodeXXX
3)、调用NSKeyedArchiver的finishEncoding方法
4)、NSMutableData保存到文件
2、归档对象实现深复制
我们知道深复制就是复制对象和原始对象没有任何公用的部分,修改复制对象的值不会对原始对象产生影响。
步骤
1)、NSKeyedArchiver的archivedDataWithRootObject
2)、NSKeyedUnarchiver的unarchiveObjectWithData
3、实现Demo
IApple.h
#import <Foundation/Foundation.h>
#ifndef IApple_h
#define IApple_h
@interface IApple : NSObject <NSCoding>
@property (nonatomic, copy) NSString *color;
@property (nonatomic, assign) double weight;
@property (nonatomic, assign) int size;
-(id)initWithColor:(NSString *) color weight:(double) weight size:(int) size;
@end
#endif /* IApple_h */
IApple.m
#import "IApple.h"
#import <Foundation/Foundation.h>
@implementation IApple
@synthesize color = _color;
@synthesize weight = _weight;
@synthesize size = _size;
-(id)initWithColor:(NSString *) color weight:(double) weight size:(int) size
{
if (self = [super init])
{
self.color = color;
self.weight = weight;
self.size = size;
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"<IApple [color = %@, weight = %g, _size = %d]>", self.color, self.weight, self.size];
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_color forKey:@"color"];
[aCoder encodeDouble:_weight forKey:@"weight"];
[aCoder encodeInt:_size forKey:@"size"];
}
-(id) initWithCoder:(NSCoder *)aDecoder
{
_color = [aDecoder decodeObjectForKey:@"color"];
_weight = [aDecoder decodeDoubleForKey:@"weight"];
_size = [aDecoder decodeIntForKey:@"size"];
return self;
}
@end
main.m
#import "IApple.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:80], @"java", [NSNumber numberWithInt:90], @"c", [NSNumber numberWithInt:70], @"oc", [NSNumber numberWithInt:100], @"c++",nil];
NSSet *set = [NSSet setWithObjects:@"java", @"ios", @"c++", @"oc", nil];
IApple *apple = [[IApple alloc] initWithColor:@"red" weight:50 size:20];
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *arch = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//归档对象
[arch encodeObject:dict forKey:@"dict"];
[arch encodeObject:set forKey:@"set"];
[arch encodeObject:apple forKey:@"apple"];
//结束归档
[arch finishEncoding];
//在document目录下创建一个chenyu.txt空文件
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [docPaths objectAtIndex:0];
NSLog(@"document path:%@", path);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *chenyuPath = [path stringByAppendingPathComponent:@"chenyu.txt"];
BOOL isSuccess = [fileManager createFileAtPath:chenyuPath contents:nil attributes:nil];
if (isSuccess) {
NSLog(@"make chenyu.txt success");
} else {
NSLog(@"make chenyu.txt fail");
}
//归档对象到chenyu.txt文件
if([data writeToFile:chenyuPath atomically:YES] == YES)
{
NSLog(@"归档对象成功");
}
else
{
NSLog(@"归档对象失败");
}
//读取归档对象
NSData *readData = [NSData dataWithContentsOfFile:chenyuPath];
NSKeyedUnarchiver *unArch = [[NSKeyedUnarchiver alloc] initForReadingWithData:readData];
NSDictionary *readDict = [unArch decodeObjectForKey:@"dict"];
NSSet *readSet = [unArch decodeObjectForKey:@"set"];
NSSet *readApple = [unArch decodeObjectForKey:@"apple"];
NSLog(@"readDict is:%@", readDict);
NSLog(@"readSet is:%@", readSet);
NSLog(@"readApple is %@", readApple);
//使用归档对戏实现深复制 深复制就是复制对象和本身对象没有任何公用部分,所以修改复制对象的属性不会影响原始对象的属性
NSDictionary *diction = [NSDictionary dictionaryWithObjectsAndKeys:[[IApple alloc] initWithColor:@"red" weight:50 size:20], @"one", [[IApple alloc] initWithColor:@"green" weight:60 size:21], @"two", nil];
//对象归档
NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:diction];
//回复对象
NSDictionary *dictCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data1];
IApple *app = [dictCopy objectForKey:@"one"];
[app setColor:@"green"];
IApple *app1 = [diction objectForKey:@"one"];
NSLog(@"app1 color is:%@", app1.color);
}
}
4、运行结果
2018-07-22 19:34:11.258816+0800 cyTest[62704:16613816] document path:*****/3FF9B833-FAF8-4C30-A855-3D40A4EAE8A6/data/Containers/Data/Application/6AD520C9-3A99-45B5-A2F9-4E4D7CA77486/Documents
2018-07-22 19:34:11.269539+0800 cyTest[62704:16613816] make chenyu.txt success
2018-07-22 19:34:11.271898+0800 cyTest[62704:16613816] 归档对象成功
2018-07-22 19:34:11.272976+0800 cyTest[62704:16613816] readDict is:{
c = 90;
"c++" = 100;
java = 80;
oc = 70;
}
2018-07-22 19:34:11.273243+0800 cyTest[62704:16613816] readSet is:{(
"c++",
java,
ios,
oc
)}
2018-07-22 19:34:11.273602+0800 cyTest[62704:16613816] readApple is <IApple [color = red, weight = 50, _size = 20]>
2018-07-22 19:34:11.274150+0800 cyTest[62704:16613816] app1 color is:red
作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)