swift 메모리 관리에서의 인용 계수
이 코드를 살펴보려면 다음과 같이 하십시오.
class Person{
var name: String
var pet: Pet?
init(name: String){
self.name = name
print("Person", name, "is initialized")
}
init(name: String, petName: String){
self.name = name
self.pet = Pet(name: petName)
print("Person", name, "is initialized")
}
deinit{
print("Person", name, "is deinitialized!")
}
}
class Pet{
var name: String
init(name: String){
self.name = name;
print("Pet", name, "is initialized")
}
deinit{
print("Pet", name, "is deinitialized!")
}
}
이 코드는 Person 클래스와 Pet 클래스 등 두 가지 클래스를 만들었고, 각 클래스에는 Pet 클래스가 포함되는지 여부에 대응하는 init 방법과 deinit 방법으로 메모리 공간을 방출했다.
우리가 이 두 가지 방법을 호출하면
var snow: Person? = Person(name: "snow", petName: "wolf")
snow = nil
다음 두 단계를 수행합니다.
Pet wolf is initialized
Person snow is initialized
Person snow is deinitialized!
Pet wolf is deinitialized!
스노우라는 대상을 만들 때 두 번째 init 방법을 사용합니다. 이 방법에서 새 Pet 대상을 만들 것입니다. 따라서 먼저 Pet wolf is initialized를 출력하고 Person snow is initialized를 출력합니다.snow 대상에 메모리를 방출할 때nil을 이 대상에게 부여하면 snow라는 메모리 공간을 방출하는 동시에wolf라는 메모리 공간도 방출한다.
그러나 만약 우리가 첫 번째 init 방법을 호출할 때 우리는 다음과 같은 것을 발견할 수 있다.
var snow: Person? = Person(name: "snow")
var wolf: Pet? = Pet(name: "wolf")
snow?.pet = wolf
snow = nil
wolf = nil
우리는 먼저 snow 대상을 만들었고, 그 다음에 또 하나의 snow 대상을 만들었다. 그리고 snow 대상에 snow 대상을 추가했다. 그러나 이 snow 대상을 메모리로 방출할 때 다음과 같은 것을 발견할 수 있다.
Person snow is initialized
Pet wolf is initialized
Person snow is deinitialized!
단지 snow의 메모리 공간만 방출되었지만wolf의 메모리 공간은 방출되지 않았습니다. 이것은 swift 메모리 관리의 인용 계수와 관련이 있습니다.
우리가 snow라는 대상을 만든 후에 우리는 그것을 위해 메모리 공간을 열었다. 이름은 a이다. 이때 snow라는 대상은 이 메모리 공간을 인용했다. 이 메모리 공간의 인용 계수는 1이다.
마찬가지로 우리가wolf라는 대상을 만든 후에 우리는 그것을 위해 메모리 공간을 열었다. 이름은 b이다. 이때wolf라는 대상은 이 메모리 공간을 인용했다. 이 메모리 공간의 인용 계수는 1이다.
우리가 스노우를?pet=wolf 이후, snow의 한 속성도 wolf라는 대상을 만드는 메모리 공간을 가리킨다. 그러면 이 메모리 공간의 인용 계수는 2.
우리가 snow=nil에 대해 메모리 공간을 방출하면 메모리 공간 a의 인용 계수는 0이고 메모리 공간 b의 인용 계수는 1이다.
시스템이 메모리 공간의 인용 계수가 0인 것을 발견하면 시스템은 이 메모리 공간을 방출하고 이때 메모리 공간 a는 방출된다.
그러나 메모리 공간 b의 인용 계수는 1로 시스템은 자동으로 메모리를 방출하지 않는다.오직 우리가 진행할 때:
wolf = nil
조작한 후에야 이 메모리 공간 b가 방출될 수 있다.
이와 마찬가지로 코드는 다음과 같습니다.
import UIKit
class Person{
var name: String
init(name: String){
self.name = name
print("Person", name, "is initialized")
}
deinit{
print("Person", name, "is being deinitialized!")
}
}
var person1: Person? = Person(name: "liuyubobobo")
var person2: Person? = person1
var person3: Person? = person1
그러면 person1의 메모리 공간의 인용 계수는 3입니다. 이 메모리 공간을 방출하려면 세 대상을 모두nil로 해야 합니다.
개인1=nil만 사용하면 이 메모리 공간을 방출하지 않습니다.
전재 대상:https://www.cnblogs.com/winterfells/p/7476485.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.