16--swift之内存管理进阶

原创
2016/03/13 17:28
阅读数 31

1.深拷贝与浅拷贝

值类型拷贝是一对一的拷贝,每个引用都有一个不同的对象,而引用型拷贝是多对一的拷贝,多个引用指向同一个对象,所以引用类型需要进行内存管理,而值类型不需要

//引用类型

class Shallow {

var copy: Int = 0


}

//值类型

struct Deep {

var copy: Int = 0

}

var s1 = Shallow()

var s2 = s1//引用类型,拷贝的是同一块内存地址,浅拷贝

var d1 = Deep()

var d2 = d1//值类型,另外分配内存,两个不同的地址,深拷贝

d1.copy = 9

print(d1.copy)

print(d2.copy)//d1值改变不影响d2

s1.copy = 9

print(s1.copy)

print(s2.copy)//s1,s2都是相同地址,同一个对象,值都改变

2.swift,字符串拷贝是深拷贝,因为它是值类型,但是在oc中,foundation类库中的字符串是引用类型,它的拷贝是浅拷贝

3.集合类型的拷贝

swift里集合是值类型的,所以是深拷贝,但是集合内元素有其他类型的,情况就比较复杂了,在oc里集合是class类型的,所以是浅拷贝

4.深入集合类型的拷贝操作

struct d {

var copy: Int = 0


}

class c {

var copy:Int = 0

}

var d1 = d()

var d2 = d()

var c1 = c()

var c2 = c()

var darray = [d1,d2]//包含两个值类型元素的数组

var carray = [c1,c2]//包含两个类类型元素的数组

var darray1 = darray//深拷贝

var carray1 = carray//浅拷贝

//改变某一数组的大小,不会影响到另外一个数组

//darray1.removeLast()

//print(darray1.count)

//print(darray.count)

//将一数组中的某个元素值改变,也不会影响另外一个数组

//darray1[0] = d(copy: 3)

//print(darray[0].copy)

//print(darray1[0].copy)

//数组中元素是值类型,则是深拷贝,是引用类型的则是浅拷贝。

5.隐式强引用


class Student {

var name: String

init(name:  String){

self.name = name


}

func show(){

print("name=\(name)")

}

deinit{

print("\(name)deinit")

}

}

var s1: Student? = Student(name: "tom")

var s2 = s1//s1,s2都显示强引用了同一个对象

s1 = nil

s2 = nil//s1,s2都置空,系统会将对象销毁

//隐式强引用(简介强引用)

var sarray = [Student(name: "huahua"),Student(name: "kite")]//间接强引用,对象加入到数组中后,对象如果是引用类型,那么数组会强引用该对象。数组让该对象的引用计数加一,当某个对象不再属于数组时,改对象的引用计数会减一,数组本身被销毁的时候,它包含的该对象不再属于它,如果对象是引用类型,它的引用计数将会减一。

sarray[0].name = "john"


展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部