在Swift中复制
如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训
skype:alok.upadhyay32
邮件:meiosdose@gmail.com
应用程式:+ 91–7838552946
嘿,这是我的第一篇文章,是的,我做到了!
我们将涵盖
- 复制
- 深拷贝
- 浅拷贝
- 参考类型的深层复制
- 写时复制(COW)
我将谈论快速复制对象。 复制可以通过两种方式进行: 复制内容和复制参考 。
复制内容也称为Deep Copy 。 Deep Copy适用于值类型。 例如结构,数组,字典,集合,字符串等。
复制参考也称为浅复制。 浅复制适用于 参考类型。 例如类。
注 —如何创建引用类型的深层副本?
引用类型的默认副本为浅表副本。 我们还可以通过确认copy(with zone: NSZone? = nil) -> Any.
并实现copy(with zone: NSZone? = nil) -> Any.
来创建引用类型的深层副本copy(with zone: NSZone? = nil) -> Any.
深度复制示例:
//首先,我们需要一个值类型。 让我们来个结构。
/ *具有变量personName和personAge的人员结构* /
struct Person {
var personName:字符串?
var personAge:整数?
}
//让我们使用Person结构
//让我们创建人物对象
var personObj = Person()
//设置人物属性
personObj.personName =“ Alok”
personObj.personAge = 18
// let创建另一个person对象,并将personObj复制到personObjAnother对象。
var personObjAnother = personObj
//让设置personObjAnother属性
personObjAnother.personName =“ Naitvik”
personObjAnother.personAge = 3
//让print personObj
print(personObj.personName!)//打印“ Alok”
print(personObj.personAge!)//打印18
//让print personObjAnother
print(personObjAnother.personName!)//打印“ Naitvik”
print(personObjAnother.personAge!)//打印3
在上面的示例中,我们看到在制作深层副本时,source(personObj)和destination(personObjAnother)对象具有自己的副本 。 对新复制的对象所做的更改不会影响源对象。
为什么要深拷贝?
深拷贝不那么容易出现争用情况,并且非常适合多线程环境。 您确定要对其执行更改的对象只会影响同一对象。 它不会对源对象产生任何影响。 这也是Apple在Swift中将集合类型(数组,字典,集合)作为值类型(在Objective C中是引用类型)的原因之一。
浅拷贝示例:
/ *具有变量personName和personAge的personC类* /
类 PersonC {
var personName:字符串?
var personAge:整数?
}
//让我们创建人物对象
让personObj = PersonC()
//设置人物属性
personObj.personName =“ Alok”
personObj.personAge = 18
// let创建另一个person对象并分配personObj。
让personObjAnother = personObj
//让设置personObjAnother属性
personObjAnother.personName =“ Naitvik”
personObjAnother.personAge = 3
//让print personObj
print(personObj.personName!)//打印“ Naitvik”
print(personObj.personAge!)//打印3
//让print personObjAnother
print(personObjAnother.personName!)//打印“ Naitvik”
print(personObjAnother.personAge!)//打印3
在上面的示例中,我们看到在制作浅表副本时,源对象(personObj)和目的地对象(personObjAnother)具有共享副本。 对新复制的对象所做的更改也会影响源对象。
为什么要浅拷贝?
浅副本的创建速度更快,因为仅共享参考。 创建的副本不会完全在内存中创建新实例,而是仅复制地址/引用。
创建引用类型的深层副本
在iOS中,我们还可以通过确认NSCopying Protocol并实现 copy(with zone: NSZone? = nil) -> Any
来创建引用类型的深层副本。
参考类型的深层复制示例
/ *具有变量personName和personAge的personD类* /
/ *我们必须确认NSCopying协议并实现func copy(区域:NSZone?= nil)->任何* /
class PersonD : NSCopying {
var personName:字符串?
var personAge:整数?
功能 副本 (区域:NSZone?= nil)->任何{
让复制= PersonD()
copy.personName = 自我 .personName
copy.personAge = 自我 .personAge
返回副本
}
//让我们创建人物对象
让 personObj = PersonD()
//设置人物属性
personObj.personName =“ Alok”
personObj.personAge = 18
/ * let创建另一个person对象并分配personObj。
我们现在将使用复制方法执行深层复制。
我们必须确保PersonD确认NSCopying协议
并实现func复制(区域:NSZone?= nil)->任何* /
让 personObjAnother = personObj.copy() 为 ! 人D
//让设置personObjAnother属性
personObjAnother.personName =“ Naitvik”
personObjAnother.personAge = 3
//让print personObj
print(personObj.personName!)//打印“ Alok”
print(personObj.personAge!)//打印18
//让print personObjAnother
print(personObjAnother.personName!)//打印“ Naitvik”
print(personObjAnother.personAge!)//打印3
在上面的示例中,我们看到在制作引用类型的深层副本时,source(personObj)和destination(personObjAnother)对象具有自己的副本 。 对新复制的对象所做的更改不会影响源对象。
写时复制(COW)
通过以上讨论,您是否想到了如果不对生成的副本进行任何更改,为什么还要创建一个新副本。 它不会创建重复的内容吗? 如果您的数组有50个元素,将会怎样? 执行复制时,是否会再次创建包含50个元素的新数组? 有思想的人认为:)。
你是对的。 复制不应创建重复的内容,并且仅当在复制的对象中进行了更改时,才应创建新的副本。 也就是说,无论是深层副本还是浅层副本,只有对复制的对象进行更改后,才会创建新副本。
写时复制示例
看一下a的基地址原始值,就像……3920“ Alok”一样。
在将a分配给b之后,让我们看一下a和b的基地址原始值, 两者都类似……3920“ Alok”。 即使在执行复制后,仍未制作新的副本。
将字符串b更改为“ Naitvik”后,让我们再次看一下a和b的基地址原始值, 两者现在都不同了。 对于a来说是…. 3920,但是对于b来说是…. 3925。 仅在对复制的对象进行了某些更改之后才能进行新的复制。
因此,写入时复制是一种内置的机制,可以防止在内存中创建重复内容而被保存。
希望你喜欢。 现在就这样。
样例代码:
Google云端硬盘 https://drive.google.com/file/d/1gVfRn2oPyP7GHtlEGOgfLywVkOBGiyS9/view?usp=sharing
比特桶
https://bitbucket.org/alokupadhyay/repos/get/SwiftCopying.zip
我也写在http://iosdose.com/wp/
快乐编码🙂
请通过评论支持我们,喜欢并分享我们的Facebook页面。
YouTube:https://bit.ly/2STjOF3
如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训
skype:alok.upadhyay32
邮件:meiosdose@gmail.com
应用程式:+ 91–7838552946