7. 循環参照
/*ユーザークラス*/
class User {
let name : String
var haveDevice : AppleDevice?
init(name : String){
self.name = name
}
deinit{
print("(name)さんはいなくなりました")
}
}
/*アップルデバイスクラス*/
class AppleDevice {
let name : String
var user : User?
init(name : String){
self.name = name
}
deinit{
print("(self.user!.name)さんの持ち物ではなくなりました")
}
}
8. 循環参照を実行
var tanaka : User?
var iPhone6s : AppleDevice?
tanaka = User(name: "田中")
iPhone6s = AppleDevice(name: "iPhone6s")
AppleDevice インスタンス
name: "iPhone6s"
user : nil
User インスタンス
name: "田中"
haveDevice : nil
var tanaka var iPhone6s
強参照 強参照
12. 循環参照を弱参照で解決
/*ユーザークラス*/
class User {
let name : String
weak var haveDevice : AppleDevice?//弱参照を指定
init(name : String){
self.name = name
}
deinit{
print("(name)さんはいなくなりました")
}
}
/*アップルデバイスクラス*/
class AppleDevice {
let name : String
var user : User?
init(name : String){
self.name = name
}
deinit{
print("(self.user!.name)さんの持ち物ではなくなりました")
}
}
13. 実行
var tanaka : User?
var iPhone6s : AppleDevice?
tanaka = User(name: "田中")
iPhone6s = AppleDevice(name: "iPhone6s")
AppleDevice インスタンス
name: "iPhone6s"
user : nil
User インスタンス
name: "田中"
haveDevice : nil
var tanaka var iPhone6s
強参照 強参照
19. 循環参照をアンオウンド参照で解決
/*カスタマークラス*/
class Customer {
let name : String
var bankAccount : BankAccount?
init(name : String){
self.name = name
}
deinit{
print("(self.name)はいなくなりました")
}
}
/*銀行口座クラス*/
class BankAccount {
let number : Int
unowned let customer : Customer
init(number : Int, customer: Customer){
self.number = number
self.customer = customer
}
deinit{
print("銀行口座:(self.number)は解約されました")
}
}
26. クロージャーの循環参照
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)を削除しました")
}
}