swift 메모리 관리에서의 인용 계수

6660 단어
swift에서 모든 대상은 생명주기가 있으며, 생명주기가 끝나면 deinit () 함수를 호출하여 메모리 공간을 방출합니다.
이 코드를 살펴보려면 다음과 같이 하십시오.
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

좋은 웹페이지 즐겨찾기