Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy

Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy,第1张

概述原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow 前言:Swift相对应Objective C来说,它不再需要绝大部分对象继承自NSObject,所以Swift的类型和Objective C的变量类型也不一致。 Value Type/Reference Type 什么是值类型,引用类型? 二者最主

原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow

前言:Swift相对应Objective C来说,它不再需要绝大部分对象继承自NSObject,所以Swift的类型和Objective C的变量类型也不一致。

Value Type/Reference Type

什么是值类型,引用类型?

二者最主要的差别在于当copy发生的时候,注意,当在Swift中使用赋值符号的时候发生的都是copy,这个在最后我会解释为什么。

Struct是值类型

struct S{    var num = -1}var a = S()var b = aa.num = 10print(b.num) //-1

可以看到,值类型拷贝后的内存是这个样子的

再来看看引用类型

class S{    var num = -1}var a = S()var b = aa.num = 10print(b.num) // 10

总结

值类型或者引用类型在赋值的时候都是copy,值类型拷贝累实际的内存(value),而饮用类型只是拷贝了指针,仍然指向最开始的内存区域

什么是值类型or 引用类型? Class的实例是引用类型 Swift方法类型是引用类型(在Swift中,方法也是一种类型) 其余的都是值类型,像Array,Dictionary本质都是Struct。 值类型的优点

优点还是很明显的,每次得到的都是一个copy,这样就可以放心的运行,没必要担心其他代码修改这个值。尤其是在多线程环境里。

值类型每次都会进行copy吗?

并不是每次都是要copy的,当值并不会改变的时候,Swift并不会进行copy。例如let a = 1;let b = a.

什么时候用值类型/引用类型?

用值类型

当你希望用==来比较的时候 赋值后有独立的状态 数据在多线程中使用

引用类型

当你希望用===来比较的时候(注意,这里三个等号) 创建共享的可变数据 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] 最初: 0x7fd1d3d74cb02015-12-01 12:07:41.862 SWTest[1082:40543] copy: 0x7fd1d3d74cb02015-12-01 12:07:41.862 SWTest[1082:40543] mutablecopy: 0x7fd1d3d18c80

可以看到,对于不可变类型

copy 是浅拷贝,只拷贝指针 mutablecopy 是深拷贝,拷贝了value

对于可变类型,举例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] 最初: 0x7fba89e8a8502015-12-01 12:10:35.721 SWTest[1113:43822] copy: 0xa0000000033323132015-12-01 12:10:38.006 SWTest[1113:43822] mutablecopy: 0x7fba89e8a960

可以看到,对于可变类型

copy 深拷贝,拷贝了value mutablecopy 是深拷贝,拷贝了value

对于不可变集合
线写一个辅助方法,打印NSArray中对象指向的地址

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] 最初: 0x7f9c304afcb02015-12-01 12:18:46.253 SWTest[1156:50909] copy: 0x7f9c304afcb02015-12-01 12:18:46.253 SWTest[1156:50909] mutablecopy: 0x7f9c304039802015-12-01 12:18:46.255 SWTest[1156:50909] 最初: 0x7f9c304b4d302015-12-01 12:18:46.255 SWTest[1156:50909] 最初: 0xb0000000000000c22015-12-01 12:18:46.255 SWTest[1156:50909] copy后: 0x7f9c304b4d302015-12-01 12:18:46.256 SWTest[1156:50909] copy后: 0xb0000000000000c22015-12-01 12:18:46.256 SWTest[1156:50909] mutablecopy后: 0x7f9c304b4d302015-12-01 12:18:46.256 SWTest[1156:50909] mutablecopy后: 0xb0000000000000c2

可以看到,对于不可变集合

对于集合本身,copy只是拷贝了指针,指针仍然指向最初的Array对象 对于集合本身,Mutablecopy拷贝了value 对于集合中存储的对象,不管是copy还是mutablecopy,都是浅拷贝。

画个图加深理解
对于NSArray的copy

对于NSArray的Mutablecopy

对于可变集合

let array = NSMutableArray(arrayliteral: Nsstring(string: "123"),description: "mutablecopy后")

可以看到Log

2015-12-01 12:31:22.818 SWTest[1209:61916] 最初: 0x7f937ad73d902015-12-01 12:31:22.818 SWTest[1209:61916] copy: 0x7f937ad91fb02015-12-01 12:31:22.819 SWTest[1209:61916] mutablecopy: 0x7f937ad731902015-12-01 12:31:22.819 SWTest[1209:61916] 最初: 0x7f937ac0c1002015-12-01 12:31:22.820 SWTest[1209:61916] 最初: 0xb0000000000000c22015-12-01 12:31:22.820 SWTest[1209:61916] copy后: 0x7f937ac0c1002015-12-01 12:31:22.820 SWTest[1209:61916] copy后: 0xb0000000000000c22015-12-01 12:31:22.820 SWTest[1209:61916] mutablecopy后: 0x7f937ac0c1002015-12-01 12:31:22.820 SWTest[1209:61916] mutablecopy后: 0xb0000000000000c2

可以看到,对于可变集合

对于集合本身,copy拷贝了value 对于集合本身,Mutablecopy拷贝了value 对于集合中存储的对象,不管是copy还是mutablecopy,都是浅拷贝 最后

欢迎关注Leo的CSDN博客,我会持续更新iOS/Objective C/Swift相关的博客

总结

以上是内存溢出为你收集整理的Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy全部内容,希望文章能够帮你解决Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1082210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存