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
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还没销毁
//这个时候 unit4A还没销毁
此时为
john =nil
//这个时候 john先销毁 john再销毁
例2:
若执行顺序为
john =nil
//这个时候先销毁
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?
//例子3
//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 因为都没抢引用了
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?
//例子3
//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
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
- swift学习arc
- swift ARC
- [Swift]:快速学习笔记4 ARC和循环引用
- 16.Swift-ARC
- ARC 学习
- ARC 学习
- ARC学习
- Swift内存管理(ARC)
- Swift 自动引用计数(ARC)
- 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- Swift 自动引用计数机制ARC
- Swift入门教程17-ARC与强弱引用
- [Swift]可选链和ARC引用计数
- Swift ARC-自动引用计数、内存管理
- swift_025(Swift 的自动引用计数(ARC)
- 电脑开启后桌面图标不显示
- PyCharm自动添加文件头注释
- Log4j使用日志
- Java与C#时间戳同步
- java中堆内存和栈内存的区别
- swift学习arc
- 第七届蓝桥杯大赛个人赛省赛(软件类)真题 C语言A组 2
- Codeforces - 441C-Valera and Tubes
- BZOJ 1041: [HAOI2008]圆上的整点 数论
- Android Launcher2之页面滑动
- test
- 【Java每日一题】20170120
- linux makefile 创建 编译学习
- 自定义组合控件TopBar