Heap 영역의 객체에 대한 강한 참조 횟수를 추적하고, 객체가 더 이상 필요 없을 때 해당 메모리를 자동으로 해제하는 방식의 메모리 관리 방법
class Person {
var name: String
init(name: String) {
self.name = name
}
}
var person1: Person? = Person(name: "Alice") // strong 참조
var person2 = person1 // 또 다른 strong 참조
// person1이 nil이 되더라도 person2가 여전히 strong 참조를 가지고 있으므로 객체는 메모리에 유지됨
person1 = nil
class Person {
var name: String
var pet: Pet? // Person이 소유하는 Pet
init(name: String) {
self.name = name
}
}
class Pet {
var species: String
var owner: Person? // Pet을 소유하는 Person
init(species: String) {
self.species = species
}
}
var person: Person? = Person(name: "Alice") // Person 클래스의 인스턴스를 생성
var pet: Pet? = Pet(species: "Dog") // Pet 클래스의 인스턴스를 생성
person?.pet = pet // Person 클래스의 pet에 Pet 인스턴스를 할당
pet?.owner = person // Pet 클래스의 owner에 Person 인스턴스를 할당
weak
키워드를 사용한 약한 참조는 객체의 참조 count를 증가시키지 않기 때문에, 객체의 생명주기에 끼치는 영향없이 참조를 유지할 수 있다.class Person {
var name: String
weak var friend: Person? // 약한 참조
init(name: String) {
self.name = name
}
}
var person1: Person? = Person(name: "Alice")
var person2: Person? = Person(name: "Bob")
person1?.friend = person2
person2?.friend = person1
// person1이 메모리에서 해제됨, 그에 따라 person1과 연결된 모든 객체의 참조 카운트가 감소됨
person1 = nil
class Country {
var name: String
var capital: City!
init(name: String, capitalName: String) {
self.name = name
self.capital = City(name: capitalName, country: self)
}
}
class City {
var name: String
unowned var country: Country // 미소유 참조
init(name: String, country: Country) {
self.name = name
self.country = country
}
}