您的位置:首页 > 移动开发 > Swift

15--swift之内存管理

2016-03-13 00:00 363 查看
1.内存管理
a。内存管理的对象--只针对引用类型的对象class
b。内存管理的原则:当没有任何引用指向某个对象的时候,系统会自动销毁该对象
c。arc自动引用计数
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所指向的对象立即被系统销毁(弱引用的特性),但是系统不会像给可选类型变量那样赋值为nil,unownedRef不是可选类型,他依然指向被销毁的对象,接下来的其他执行命令都会出现错误
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?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: