15--swift之内存管理

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?


转载于:https://my.oschina.net/u/2598427/blog/636527

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值