swift에 대한 weak var의 행동
개시하다
swift에서
let
나 var
가 아니라 억지로 사용하는 경우weak var
가 어떤 상황이나 행동에 따라 내 마음속에 말로 쓰고 싶다.벽장에 자주 쓰인 곳
[weak self]
은 몇 년 전 이 글에 쓰여 있었다.let/var/weak var의 차이
let
var
weak var
class
의 변수weak
에만 사용할 수 있다.weak
의 차이는 약하게 참조되고 싶다.Weak References 정보
다음 공식 ARC의 Weak References에 대한 설명에 적혀 있습니다.
특히
A weak reference is a reference that doesn’t keep a strong hold on the instance it refers to, and so doesn’t stop ARC from disposing of the referenced instance. This behavior prevents the reference from becoming part of a strong reference cycle. You indicate a weak reference by placing the weak keyword before a property or variable declaration.
Because a weak reference doesn’t keep a strong hold on the instance it refers to, it’s possible for that instance to be deallocated while the weak reference is still referring to it. Therefore, ARC automatically sets a weak reference to nil when the instance that it refers to is deallocated. And, because weak references need to allow their value to be changed to nil at runtime, they’re always declared as variables, rather than constants, of an optional type.
weak이 있으면 변수 인스턴스가 버려지는 것을 방지하지 않기 때문에 인스턴스가 버려질 수 있으며 ARC에서 자동으로 nil을 설정할 수 있습니다.따라서 변수
var
로 발표weak
는 반드시var
이어야 한다.발표할 수 없음weak let
.이런 견해가 있다.참고로
weak let
에서 성명하면 다음과 같은 구축 오류가 발생합니다.코드 예
이용 방법
import Foundation
class Person: CustomStringConvertible {
let name: String
init(name: String) {
self.name = name
}
var description: String {
"My name is \(self.name)."
}
}
class Logic {
var person: Person?
init(person: Person) {
self.person = person
}
}
var person: Person? = Person(name: "hs7")
let logic = Logic(person: person!)
person = nil
print(logic.person)
// 出力結果
// Optional(My name is hs7.)
let 활용
import Foundation
class Person: CustomStringConvertible {
let name: String
init(name: String) {
self.name = name
}
var description: String {
"My name is \(self.name)."
}
}
class Logic {
let person: Person?
init(person: Person) {
self.person = person
}
}
var person: Person? = Person(name: "hs7")
let logic = Logic(person: person!)
person = nil
print(logic.person)
// 出力結果
// Optional(My name is hs7.)
네트워크 활용
설정
import Foundation
class Person: CustomStringConvertible {
let name: String
init(name: String) {
self.name = name
}
var description: String {
"My name is \(self.name)."
}
}
class Logic {
weak var person: Person?
init(person: Person) {
self.person = person
}
}
var person: Person? = Person(name: "hs7")
let logic = Logic(person: person!)
person = nil // 🐦このタイミングでlogic.personにnilがARCによって設定されます。logic.personはweakなためです。
print(logic.person)
// 出力結果
// nil
weak var
만 한 후person = nil
의logic.person
에도 설정person
했다.Unowned References
수치를 약시하고 싶지만 nil이 되지 않을 것을 알았을 때는 Unnowned References를 이용하는 것이 좋다.이는 인스턴스가 폐기된 ARC에도 nil이 설정되지 않고
nil
도 사용할 수 있기 때문(폐기된 경우unowned let
오류를 참조한 경우)이다.나는 별로 써 본 적이 없다signal SIGABRT.
.import Foundation
class Person: CustomStringConvertible {
let name: String
init(name: String) {
self.name = name
}
var description: String {
"My name is \(self.name)."
}
}
class Logic {
unowned let person: Person
init(person: Person) {
self.person = person
}
}
var person: Person? = Person(name: "hs7")
let logic = Logic(person: person!)
person = nil // このタイミングでpersonは破棄される。logic.personの参照は残ったまま。
print(logic.person) // ❌error: Execution was interrupted, reason: signal SIGABRT.
총결산
다음은
unowned
시의 행위를 총결하였다.weak var
에서 선언하는 것이 좋은 모델로서 존재weak var
,View
등 생명주기의 대상을 이 생명주기에 의존하지 않는 대상 내에서 변수로 선언하는 경우ViewController
이상하게도 대상이 유지되지 않아 메모리 효율이 좋아질 것 같고 오류 동작(원래 폐기된 타이밍에 폐기되지 않았던 View 등)도 줄어들 것 같다.
Reference
이 문제에 관하여(swift에 대한 weak var의 행동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hs7/articles/86873ff05fa3bf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)