Weak vs Unowned
サマリ weak
(optional) vs unowned
(non-optional)
コンセプト weak
およびunowned
は、Strong Reference Cycleを解決するために使用される.
2つの方法の違いは、オプションと非オプションの違いです.weak
の場合、オプションを使用する必要があります.unonwed
仮定値は無条件で使用され、オプションは使用されない.weak
を使用したコードを次に示します.class Company {
let name: String
weak var car: Car?
init(name: String) {
self.name = name
print("Company Init")
}
deinit { print("Company Deinit") }
}
class Car {
let name: String
var company: Company?
init(name: String) {
self.name = name
print("Car Init")
}
deinit { print("Car Deinit") }
}
var k8: Car? = .init(name: "k8") // Car Init
var kia: Company? = .init(name: "KIA") // Company Init
k8?.company = kia
kia?.car = k8
k8 = nil // Car Deinit
kia?.car // nil
Company(kia)
とCar(k8)
の2つのクラスが互いに相手を指し合う場合、Car
を解除した後にCompany
を出力する属性car
は、出力nil
を見ることができる.weak
デフォルトでは、インスタンスがメモリから解放されると、nilが割り当てられます.したがって、Company(kia)
のproperty car
が指すCar(k8)
が解除されると、car
がnilに割り当てられる.
では、上記のコードでweak
をunowned
に変更したらどうなるのでしょうか.class Company {
let name: String
unowned var car: Car?
init(name: String) {
self.name = name
print("Company Init")
}
deinit { print("Company Deinit") }
}
class Car {
let name: String
var company: Company?
init(name: String) {
self.name = name
print("Car Init")
}
deinit { print("Car Deinit") }
}
var k8: Car? = .init(name: "k8") // Car Init
var kia: Company? = .init(name: "KIA") // Company Init
k8?.company = kia
kia?.car = k8
k8 = nil // Car Deinit
kia?.car //Error
上の図に示すように、エラーが表示されます.weak
とは異なり、unowned
が示すインスタンスが解除されるとnilは返されません.代わりに、無効なメモリアドレス値の取得を続行します.そのため、接近しようとすると、次のエラーが発生します.
したがって、unowned
はnon-optionalに設定する必要があります.次のコードは、unowned
が正しく使用されているコードです.class Company {
let name: String
unowned let car: Car
init(name: String, car: Car) {
self.name = name
self.car = car
print("Company Init")
}
deinit { print("Company Deinit") }
}
class Car {
let name: String
var company: Company?
init(name: String) {
self.name = name
print("Car Init")
}
deinit { print("Car Deinit") }
}
参考資料
https://babbab2.tistory.com/27
http://minsone.github.io/mac/ios/rules-of-weak-and-unowned-in-swift
https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
Reference
この問題について(Weak vs Unowned), 我々は、より多くの情報をここで見つけました
https://velog.io/@mo_nireu/Weak-vs-Unowned
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
weak
およびunowned
は、Strong Reference Cycleを解決するために使用される.2つの方法の違いは、オプションと非オプションの違いです.
weak
の場合、オプションを使用する必要があります.unonwed
仮定値は無条件で使用され、オプションは使用されない.weak
を使用したコードを次に示します.class Company {
let name: String
weak var car: Car?
init(name: String) {
self.name = name
print("Company Init")
}
deinit { print("Company Deinit") }
}
class Car {
let name: String
var company: Company?
init(name: String) {
self.name = name
print("Car Init")
}
deinit { print("Car Deinit") }
}
var k8: Car? = .init(name: "k8") // Car Init
var kia: Company? = .init(name: "KIA") // Company Init
k8?.company = kia
kia?.car = k8
k8 = nil // Car Deinit
kia?.car // nil
Company(kia)
とCar(k8)
の2つのクラスが互いに相手を指し合う場合、Car
を解除した後にCompany
を出力する属性car
は、出力nil
を見ることができる.weak
デフォルトでは、インスタンスがメモリから解放されると、nilが割り当てられます.したがって、Company(kia)
のproperty car
が指すCar(k8)
が解除されると、car
がnilに割り当てられる.では、上記のコードで
weak
をunowned
に変更したらどうなるのでしょうか.class Company {
let name: String
unowned var car: Car?
init(name: String) {
self.name = name
print("Company Init")
}
deinit { print("Company Deinit") }
}
class Car {
let name: String
var company: Company?
init(name: String) {
self.name = name
print("Car Init")
}
deinit { print("Car Deinit") }
}
var k8: Car? = .init(name: "k8") // Car Init
var kia: Company? = .init(name: "KIA") // Company Init
k8?.company = kia
kia?.car = k8
k8 = nil // Car Deinit
kia?.car //Error
上の図に示すように、エラーが表示されます.
weak
とは異なり、unowned
が示すインスタンスが解除されるとnilは返されません.代わりに、無効なメモリアドレス値の取得を続行します.そのため、接近しようとすると、次のエラーが発生します.したがって、
unowned
はnon-optionalに設定する必要があります.次のコードは、unowned
が正しく使用されているコードです.class Company {
let name: String
unowned let car: Car
init(name: String, car: Car) {
self.name = name
self.car = car
print("Company Init")
}
deinit { print("Company Deinit") }
}
class Car {
let name: String
var company: Company?
init(name: String) {
self.name = name
print("Car Init")
}
deinit { print("Car Deinit") }
}
参考資料
https://babbab2.tistory.com/27
http://minsone.github.io/mac/ios/rules-of-weak-and-unowned-in-swift
https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
Reference
この問題について(Weak vs Unowned), 我々は、より多くの情報をここで見つけました
https://velog.io/@mo_nireu/Weak-vs-Unowned
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(Weak vs Unowned), 我々は、より多くの情報をここで見つけました https://velog.io/@mo_nireu/Weak-vs-Unownedテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol