Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy
原创Blog,转载请注明出处 前言:Swift相对应Objective C来说,它不再需要绝大部分对象继承自 Value Type/Reference Type什么是值类型,引用类型? 二者最主要的差别在于当copy发生的时候,注意,当在Swift中使用赋值符号的时候发生的都是copy,这个在最后我会解释为什么。 Struct是值类型 struct S{
var num = -1
}
var a = S()
var b = a
a.num = 10
print(b.num) //-1
可以看到,值类型拷贝后的内存是这个样子的 再来看看引用类型 class S{
var num = -1
}
var a = S()
var b = a
a.num = 10
print(b.num) // 10
总结
什么是值类型or 引用类型?
值类型的优点
值类型每次都会进行Copy吗?
什么时候用值类型/引用类型?用值类型
引用类型
Copy/MutableCopy对于不可变类型,举例NSString let str1 = NSString(string: "123")
let str2 = str1.copy() as! NSString
let str3 = str1.mutableCopy() as! NSMutableString
NSLog("最初: %p",str1)
NSLog("copy: %p",str2)
NSLog("mutableCopy: %p",str3)
可以看到Log 2015-12-01 12:07:41.861 SWTest[1082:40543] 最初: 0x7fd1d3d74cb0
2015-12-01 12:07:41.862 SWTest[1082:40543] copy: 0x7fd1d3d74cb0
2015-12-01 12:07:41.862 SWTest[1082:40543] mutableCopy: 0x7fd1d3d18c80
可以看到,对于不可变类型
对于可变类型,举例NSMutableString let str1 = NSMutableString(string: "123")
let str2 = str1.copy() as! NSString
let str3 = str1.mutableCopy() as! NSMutableString
NSLog("最初: %p",str1)
NSLog("copy: %p",str2)
NSLog("mutableCopy: %p",str3)
可以看到Log 2015-12-01 12:10:35.721 SWTest[1113:43822] 最初: 0x7fba89e8a850
2015-12-01 12:10:35.721 SWTest[1113:43822] copy: 0xa000000003332313
2015-12-01 12:10:38.006 SWTest[1113:43822] mutableCopy: 0x7fba89e8a960
可以看到,对于可变类型
对于不可变集合 func logArrayElementPointAdderss(array:NSArray,description:String){
for element in array{
let object = element as! NSObject
NSLog("%@: %p",description,object)
}
}
然后 let array = NSArray(arrayLiteral: NSString(string: "123"),NSNumber(int: 12))
let array1 = array.copy() as! NSArray
let array2 = array.mutableCopy() as! NSMutableArray
NSLog("最初: %p",array)
NSLog("copy: %p",array1)
NSLog("mutableCopy: %p",array2)
logArrayElementPointAdderss(array,description: "最初")
logArrayElementPointAdderss(array1,description: "copy后")
logArrayElementPointAdderss(array2,description: "mutableCopy后")
看看Log 2015-12-01 12:18:46.252 SWTest[1156:50909] 最初: 0x7f9c304afcb0
2015-12-01 12:18:46.253 SWTest[1156:50909] copy: 0x7f9c304afcb0
2015-12-01 12:18:46.253 SWTest[1156:50909] mutableCopy: 0x7f9c30403980
2015-12-01 12:18:46.255 SWTest[1156:50909] 最初: 0x7f9c304b4d30
2015-12-01 12:18:46.255 SWTest[1156:50909] 最初: 0xb0000000000000c2
2015-12-01 12:18:46.255 SWTest[1156:50909] copy后: 0x7f9c304b4d30
2015-12-01 12:18:46.256 SWTest[1156:50909] copy后: 0xb0000000000000c2
2015-12-01 12:18:46.256 SWTest[1156:50909] mutableCopy后: 0x7f9c304b4d30
2015-12-01 12:18:46.256 SWTest[1156:50909] mutableCopy后: 0xb0000000000000c2
可以看到,对于不可变集合
画个图加深理解 对于NSArray的MutableCopy 对于可变集合 let array = NSMutableArray(arrayLiteral: NSString(string: "123"),description: "mutableCopy后")
可以看到Log 2015-12-01 12:31:22.818 SWTest[1209:61916] 最初: 0x7f937ad73d90
2015-12-01 12:31:22.818 SWTest[1209:61916] copy: 0x7f937ad91fb0
2015-12-01 12:31:22.819 SWTest[1209:61916] mutableCopy: 0x7f937ad73190
2015-12-01 12:31:22.819 SWTest[1209:61916] 最初: 0x7f937ac0c100
2015-12-01 12:31:22.820 SWTest[1209:61916] 最初: 0xb0000000000000c2
2015-12-01 12:31:22.820 SWTest[1209:61916] copy后: 0x7f937ac0c100
2015-12-01 12:31:22.820 SWTest[1209:61916] copy后: 0xb0000000000000c2
2015-12-01 12:31:22.820 SWTest[1209:61916] mutableCopy后: 0x7f937ac0c100
2015-12-01 12:31:22.820 SWTest[1209:61916] mutableCopy后: 0xb0000000000000c2
可以看到,对于可变集合
最后欢迎关注Leo的CSDN博客,我会持续更新iOS/Objective C/Swift相关的博客 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |