永利爆大奖安全网址-永利爆大奖线路检测中心

【永利爆大奖安全网址,永利爆大奖线路检测中心】,欢迎来到【LG】娱乐中心,玩你所玩,看你所看,澳门皇冠,太阳集团,澳门太阳赌城,永利402,55402com永利,永利402com,澳门十大赌场,手机网投平台,赌博app官网,永利官网,永利国际,永利皇宫,永利注册,金沙城,金沙官网奥门金沙网址,4166am金沙,我们是一家正规的网上官方平台,自创建以来,以其稳定、安全、快捷和良好的信誉得到了各界同仁的一致认可和好评。期待您的到来!

iOS中的深拷贝和浅拷贝的求学记录

日期:2020-01-05编辑作者:关于计算机

ios对象copy的方法,要实现nscopy协议

 

ios对象copy的方法,要实现nscopy协议

by 伍雪颖

- (id)copyWithZone:(NSZone *)zone
{
    RestEntity *copy = [[[self class] allocWithZone:zone] init];
    copy.dishId = _dishId;
    return copy;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
    RestEntity *copy = [RestEntity allocWithZone:zone];
    copy.dishId = _dishId;
    return copy;
}

NSObject

ios对象copy的方法,要实现nscopy协议 by 伍雪颖 - (id)copyWithZone:(NSZone *)zone{ RestEntity *copy = [[[self class] allocWit...

copy与retain的区别:

copy是创建叁个新指标,retain是开创二个指针,引用对象计数加1。Copy属性表示两个指标内容生龙活虎致,新的靶子retain为1 ,与旧有目的的援用计数非亲非故,旧有对象未有调换。copy减少对象对上下文的注重。retain属性表示五个对象地址相同(建构三个指南针,指针拷贝),内容自然类似,那几个目的的retain值+1也正是说,retain 是指针拷贝,copy 是内容拷贝。

在ios中实际不是有所的指标都扶植copy,mutableCopy,服从NSCopying 左券的类能够发送copy音信,听从NSMutableCopying 公约的类才足以发送mutableCopy音信。要是发送了几个还没有服从上诉两研商而发送 copy或然mutableCopy,那么就能产生极其。可是私下认可的ios类并不曾服从那三个公约。假使想自定义一下copy 那么就亟须固守NSCopying,而且实现 copyWithZone: 方法,倘诺想自定义一下mutableCopy 那么就务须遵守NSMutableCopying,并且落成 mutableCopyWithZone: 方法。

 

  1. 系统的非容器类对象(NSString,NSNumber等等State of Qatar

 

 

NSString *string = @深拷贝与浅拷贝;
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];

NSLog(@%p,string);
NSLog(@%p,stringCopy);
NSLog(@%p,stringMCopy);

能够看出结果如下

 

图片 1

 

除此以外唠叨一句,假如那时打印retainCount你会发觉计数是

图片 2

 

那是为何呢,因为实在NSString 已经autorelease了,正是说retainCount 对于autorelease音讯发出的的对象,并离谱。所以计数是未曾意思的.

 

 

NSMutableString *string = [NSMutableString stringWithString: @origion];
    NSString *stringCopy = [string copy];
    NSMutableString *mStringCopy = [string copy];
    NSMutableString *stringMCopy = [string mutableCopy];
    [mStringCopy appendString:@mm];//error
    [string appendString:@ origion!];
    [stringMCopy appendString:@!!];

    NSLog(@%p,string);
    NSLog(@%p,mStringCopy);
    NSLog(@%p,stringCopy);
    NSLog(@%p,stringMCopy);

图片 3

 

 

敲定:以上多少个NSString对象所分配的内部存款和储蓄器都是不相近的。不过对于mStringCopy其实是个不可变对象,所以上述会报错。对于系统的非容器类对象,大家得以感觉,假若对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy正是指标复制(深拷贝)。如果是对可变对象复制,都是深拷贝,然而copy重临的对象是不可变的。

 

  1. 系统的容器类对象

 

//copy返回不可变对象,mutablecopy返回可变对象
    NSArray *array1 = [NSArray arrayWithObjects:@a,@b,@c,nil];
    NSArray *arrayCopy1 = [array1 copy];
    //arrayCopy1是和array同一个NSArray对象(指向相同的对象),包括array里面的元素也是指向相同的指针
    NSLog(@array1 retain count: %d,[array1 retainCount]);
    NSLog(@array1 retain count: %d,[arrayCopy1 retainCount]);

    NSLog(@array1地址 : %p,array1);
    NSLog(@arrayCopy1地址 : %p,arrayCopy1);

    NSMutableArray *mArrayCopy1 = [array1 mutableCopy];
    //mArrayCopy1是array1的可变副本,指向的对象和array1不同,但是其中的元素和array1中的元素指向的是同一个对象。mArrayCopy1还可以修改自己的对象
    [mArrayCopy1 addObject:@de];
    [mArrayCopy1 removeObjectAtIndex:0];

    NSLog(@mArrayCopy1地址 : %p,mArrayCopy1);

    NSLog(@array1=%@,array1);
    NSLog(@arrayCopy1=%@,arrayCopy1);
    NSLog(@mArrayCopy1=%@,mArrayCopy1);

图片 4

 

 

array1和arrayCopy1是指针复制,而mArrayCopy1是目的复制,mArrayCopy1还能校勘期内的要素:删除或加上。然则注意的是,容器内的成分内容都以指针复制。

 

对此容器来说,其成分对象始终是指针复制。假使必要成分对象也是目的复制,就需求落实深拷贝

 

 

NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@first],@b,@c,nil];

    NSArray *deepCopyArray=[[NSArray alloc] initWithArray: array copyItems: YES];

    NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
                                  [NSKeyedArchiver archivedDataWithRootObject: array]];

trueDeepCopyArray是完全意义上的深拷贝,而deepCopyArray则不是,对于deepCopyArray内的不行产生分其仍旧指针复制。大概我们相濡以沫达成深拷贝的秘诀。因为若是容器的某一成分是不可变的,那您复制完后该指标依然是不可能更换的,由此只要求指针复制就能够。除非您对容器内的因素重新赋值,否则指针复制即已丰富。

 

 

  1. 自定义对象

倘若是大家定义的对象,那么大家和睦要落到实处NSCopying,NSMutableCopying那样就会调用copy和mutablecopy了。

 

@interface MyObj : NSObject
{
         NSMutableString *name;
         NSString *imutableStr;
         int age;
}
@property (nonatomic, retain) NSMutableString *name;
@property (nonatomic, retain) NSString *imutableStr;
@property (nonatomic) int age;
@end
@implementation MyObj
@synthesize name;
@synthesize age;
@synthesize imutableStr;
- (id)init
{
         if (self = [super init])
         {
                   self.name = [[NSMutableString alloc]init];
                   self.imutableStr = [[NSString alloc]init];
                   age = -1;
         }
         return self;
}
- (void)dealloc
{
         [name release];
         [imutableStr release];
         [super dealloc];
}
- (id)copyWithZone:(NSZone *)zone
{
         MyObj *copy = [[[self class] allocWithZone:zone] init];
         copy->name = [name copy];
         copy->imutableStr = [imutableStr copy];
//       copy->name = [name copyWithZone:zone];;
//       copy->imutableStr = [name copyWithZone:zone];//
         copy->age = age;
         return copy;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
         MyObj *copy = NSCopyObject(self, 0, zone);
         copy->name = [self.name mutableCopy];
         copy->age = age;
         return copy;
}

非指针型实例变量未有浅复制与深复制之分,像布尔型、整型、浮点型。浅复制与深复制是照准指针型实例变量说的,浅复制就只是复制了指针到别本中,原始对象与别本共享内部存储器数据;深复制就是把内部存款和储蓄器的能源也复制了,原始对象和别本分别对应和睦的内部存款和储蓄器数据。

 

 

最终再写二个事例

 

NSMutableDictionary *srcDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@value, @key, nil];  
NSMutableDictionary *dicCopy = [srcDic copy];//注意这里对NSMutableDictionary进行copy操作  
NSLog(@srcDic:%p, %@, srcDic, srcDic);  
NSLog(@dicCopy:%p %@, dicCopy, dicCopy);  
[dicCopy setObject:@newValue forKey:@key];//尝试修改dicCopy里面的值  

结果:

srcDic:0x7144ea0, {  
    key = value;  
}  
dicCopy:0x71445c0 {  
    key = value;  
}  
[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x71445c0  

 

结论:

 

 

由[srcDic mutableCopy]获得的dicCopy,两个内部存款和储蓄器地址不相近,便是copy对NSMutableDictionary类型举行了深复制,当尝试更正dicCopy里面包车型客车值时,开掘报错了,纠正不了,可以分明别本dicCopy是不可变别本。约等于说,copy三个Mutable类型能够沈复制,可是其归来的 如故一个不可变的类型.

 

copy是成立二个新指标,retain是开创一个指南针,引用对象计数加1。Copy属性表示五个指标内容意气风发致,新的对象retain为1 ,与...

本文由永利爆大奖安全网址发布于关于计算机,转载请注明出处:iOS中的深拷贝和浅拷贝的求学记录

关键词:

Python抓取京东图书评论数据

Python抓取京东图书争辨数据,python图书商量  京东图书议论有特别丰硕的音讯,那中间就隐含了购置日期、书名、小...

详细>>

Linux查看程序

Linux查看程序、进度的注重库的不二等秘书技 1. 用到ldd查看可执路程序的信赖库 [[email protected]~]# ldd /usr/local/php/bin...

详细>>

Computer根基

一、计算机基础,,计算机基础 计算机基础 一、我们为什么要学习计算机基础 我们学习python离不开计算机基础,想要...

详细>>

六招远隔服务器数据竟然错过,六艺术帮你找回

服务器数据竟然错失了怎么办,已经不见或从不遗失的同室们无妨看看以下六招,可能能令你远远地离开遗失数据的...

详细>>