swift学习arc

来源:互联网 发布:海颐软件北京分公司 编辑:程序博客网 时间:2024/05/17 08:14
1.一个类,只要指向改类的强引用的个数为0的时候,这个类才销毁
例如代码:
例1:
class Person {
   
let name:String
   
init(name:String) {self.name = name }
   
var apartment:Apartment?
   
deinit { print("\(name) is being deinitialized") }
}

class Apartment {
   
let unit:String
   
init(unit:String) {self.unit = unit }
   
weakvar tenant:Person?
   
deinit { print("Apartment\(unit) is being deinitialized") }
}

var john:Person?
var unit4A:Apartment?

john = Person(name:
"John Appleseed")
unit4A = Apartment(unit:
"4A")

john!.apartment = unit4A
unit4A!.tenant = john


unit4A =nil
//这个时候 unit4A还没销毁
此时为

john =nil
//这个时候 john先销毁 john再销毁


例2:
若执行顺序为
john =nil
//这个时候先销毁

unit4A =nil
//这个时候 unit4A销毁



例子2
class Customer {
   
let name:String
   
var card:CreditCard?
   
init(name:String) {
       
self.name = name
    }
   
deinit {print("\(name) is being deinitialized") }
}
class CreditCard {
   
let number:UInt64
   
unownedlet customer:Customer
   
init(number:UInt64, customer:Customer) {
       
self.number = number
       
self.customer = customer
    }
   
deinit {print("Card #\(number) is being deinitialized") }
}

var john:Customer?

//例子
//john = Customer(name: "John Appleseed")
//
//var card = CreditCard(number: 1234_5678_9012_3456, customer:john!)
//john!.card = card
//
// john = nil
////
打印John Appleseed is being deinitialized 只有john被销毁,因为card还有一个抢引用
////
例子4


john =Customer(name:"John Appleseed")

john!.card = CreditCard(number:1234_5678_9012_3456, customer:john!)

john =nil
//John Appleseed is being deinitialized
//Card #1234567890123456 is being deinitialized
因为都没抢引用了

例子3:无主引用以及隐式解析可选属性”
class Country {
   let name:String
   
var capitalCity:City!
   
init(name:String, capitalName:String) {
       
self.name = name
       
self.capitalCity = City(name: capitalName, country:self)
    }
}

class City {
   
let name:String
   
unownedlet country:Country
   
init(name:String, country:Country) {
       
self.name = name
       
self.country = country
    }
}


var country =Country(name:"Canada", capitalName:"Ottawa")
print("\(country.name)'s capital city is called \(country.capitalCity.name)的国家是\(country.capitalCity.country.name)")
// 打印 Canada's capital city is called Ottawa的国家是 Canada
例子4:闭包采用补货列表来避免

class HTMLElement {

    let name: String
    let text: String?

    lazy var asHTML: Void -> String = {
        [unowned self] in
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) is being deinitialized")
    }

}
0 0
原创粉丝点击