15--swift之内存管理

原创
2016/03/13 11:50
阅读数 82

1.内存管理

a。内存管理的对象--只针对引用类型的对象class

b。内存管理的原则:当没有任何引用指向某个对象的时候,系统会自动销毁该对象

carc自动引用计数

class MemArc {

deinit{

print("deinit")

}

}

var r = MemArc()

var r1 = r

var r2 = MemArc()


r = r2

r1 = r2//r,r1,r2都指向了一个对象,所以第一个实例化的对象就会被系统自动销毁,系统会调用deinit

2.weak引用

//strong引用,就是默认的引用方式

class REf {

deinit{

print("deinit")

}

func test(){

print("test")

}

}

weak var weakRef = REf()//当对象指向弱引用,系统会自动将对象销毁,会调用deinit,并赋值为nil


var strongRef = REf()//默认的引用方式就是强引用,引用计数自动加一

weak var weakRef1: REf? = REf()//弱引用是一个可选类型

//对可选类型的调用不能强制解包,只能隐式解包

//weakRef1!.test()强制解包会出错

//隐式解包

if let wr = weakRef1{

wr.test()

}

//weak引用不会影响程序的生命周期,生命周期只取决于强引用,所以weak引用引用计数不会加一

3.unowned

class REf {

deinit{

print("deinit")

}

func test(){

print("test")

}

}

unowned var unownedRef: REf = REf()//也是弱引用,无主引用,weak不同的是,它修饰的不是可选类型,所以没有weak安全,因为此条语句执行完后,unownedRef所指向的对象立即被系统销毁(弱引用的特性),但是系统不会像给可选类型变量那样赋值为nilunownedRef不是可选类型,他依然指向被销毁的对象,接下来的其他执行命令都会出现错误

unownedRef.test()//会出错

4.weak解决循环强引用问题

arc不是万能的,它可以很好的解决内存过早释放的问题,但是在某些场合下不能很好的解决内存泄漏的问题

循环强引用是:对方类互相持有对方

class Person {

let name: String

init(name: String){

self.name = name


}

var apartment: Apartment?

deinit{

print("\(name)is being deinitialized")

}

}

class Apartment {

let number: Int

init(number: Int){

self.number = number

}

var tenant: Person?

deinit{

print("Apartment#\(number)is being deinitialized")

}

}

var john: Person?

var number32: Apartment?

john = Person(name: "john sheldon")//强引用

number32 = Apartment(number: 502)//强引用

john!.apartment = number32//相互持有对方类属性

number32!.tenant = john

john = nil

number32 = nil//都指向nil,系统应该销毁,deinit应该被调用,但是没有被调用,事实上,两个对象没有被销毁,我们没有办法在访问他们了,导致内存泄漏。

//如何解决。可以将某一个类可选属性设置为weak引用,如weak var tenant: Person?


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