当前位置: 游戏平台 > 互联网科技 > 正文

ios copy和strong,浅拷贝和深拷贝

时间:2020-04-28 11:25来源:互联网科技
浅拷贝:并不拷贝对象本身,仅仅是拷贝指向对象的指针 深拷贝:直接拷贝整个对象内容到另一块内存中再简单些说:浅拷贝就是指针拷贝;深拷贝就是内容拷贝。 其实我一直对于例
  • 浅拷贝:并不拷贝对象本身,仅仅是拷贝指向对象的指针
  • 深拷贝:直接拷贝整个对象内容到另一块内存中再简单些说:浅拷贝就是指针拷贝;深拷贝就是内容拷贝。

其实我一直对于例如属性中的copy OR [array copy]这样的使用稀里糊涂的。之前有总结过,无奈现在又忘了。只能再理一遍了。首先,我们知道,iOS中,不是所有的对象都支持copy、mutableCopy。遵守NSCopying协议的类可以发送copy消息,遵守NSMutableCopying协议的类才可以发送mutablecopy消息。

copy
@property (nonatomic, copy) NSString *name;
self.name = mutableString;
这时,name对mutableString一个深拷贝,另开辟一个空间,将mutableString内容拷贝到这个空间中,self.name指向这个空间,修改mutableString,不影响self.name。
self.name = string;
这时,name对string是一个浅拷贝,只是将指针指向这个string所指向的对象,因为string是不可变对象,self.name也是不可变对象,不会发生修改现象,但可将string指向另个对象,但此时的self.name指向的对象并不会变。

在非集合类的对象中(例如NSString):

[string copy] // 浅拷贝[string mutableCopy] //深拷贝[mutableString copy] //深拷贝[mutableString mutableCopy] //深拷贝

顾名思义,copy就是复制了一个imutable的对象,而mutablecopy就是复制了一个mutable的对象。

strong
@property (nonatomic, strong) NSString *name;
self.name = mutableString;
这时,name对mutableString一个浅拷贝,只是将指针指向这个mutablestring所指向的对象,若mutableString对象发生改变,则self.name对象也将发生改变,因为它们始终指向的是同一个对象。
self.name = string;
这时,name对string一个浅拷贝,只是将指针指向这个string这个对象,因为string是不可变对象,self.name也是不可变对象,不会发生修改现象,但可将string指向另个对象,但此时的self.name指向的对象并不会变。

在集合类的对象中(例如NSArray):

[array copy] // 浅拷贝[array mutableCopy] //单层深拷贝[mutableArray copy] //单层深拷贝[mutableArray mutableCopy] //单层深拷贝

这里的单层深拷贝(one-level-deep copy)是指集合对象中可能会包含指针类型的实例变量,所以值拷贝了Array,而其中的元素知识浅拷贝。

在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。

例如自定义一个Person的类:

@interface Person : NSObject<NSCopying>@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) NSInteger age;@end

要想实现对person的拷贝即:

//自定义对象的复制- testPerson { Person *person1 = [[Person alloc] init]; person1.age = 20; person1.name = @"小李"; Person *person2 = [person1 copy]; NSLog(@"person1_p: %p", person1); NSLog(@"person2_p: %p", person2);}

则在person中必须实现copyWithZone的方法,即:

- (nonnull id)copyWithZone:(nullable NSZone *)zone { Person *person = [[[self class] allocWithZone:zone] init]; person.name = self.name; person.age = self.age; return person;}

否则程序会崩溃,同理NSMutableCopy也是如此。

参考文章:

// 1、对一个非集合类对象的copy、mutableCopy NSString *string = @"abc"; NSString *stringCopy = [string copy]; NSMutableString *stringMutableCopy = [string mutableCopy]; NSLog(@"%p",string); NSLog(@"%p",stringCopy); NSLog(@"%p",stringMutableCopy);

 

图片 1对imutable非集合类对象的copy、mutableCopy

@property (nonatomic, strong) NSMutableArray *array;

可以看出:对一个iMutable的非集合类对象string,调copy方法,其实复制的是string对象指向那块内存地址的指针,是指针拷贝,string 和stringCopy都是指向的同一块内存地址。而调mutableCopy方法,复制的是string对象指向的那块内存地址的内容,是内容拷贝,stringMutableCopy重新指向一块内存地址,而这个内存地址保存的内容是从string指向的内存地址复制过来的,stringMutableCopy是一个可变对象。

self.array = mutableArray;

编辑:互联网科技 本文来源:ios copy和strong,浅拷贝和深拷贝

关键词: