Youngminah/TIL

weak와 unowned 참조

Youngminah opened this issue · 0 comments

참조

  • 강력 순환 참조(Strong Reference Cycle)를 벗어나기 위해
  • 약한 참조(weak reference)와
  • 미소유 참조(unowned reference)를 사용


weak와 unowned

  • Optional : weakunowned의 차이점은 옵셔널이냐 옵셔널이 아니냐의 차이
  • 즉, unowned는 값이 있음을 가정하고 사용하며,
  • unowned 값이 nil이라고 한다면 크래쉬가 발생할 수 있음.
  • RC를 +1 시키지 않고 참조하는 것.


코드예제

class Person {
	let name: String
	init(name: String) { self.name = name }
	var apartment: Apartment?
	deinit { println("\(name) is being deinitialized") }
}
 
class Apartment {
	let number: Int
	init(number: Int) { self.number = number }
	weak var tenant: Person?
	deinit { println("Apartment #\(number) is being deinitialized") }
}
  • weak를 사용하는 코드

class Customer {
	let name: String
	var card: CreditCard?
	init(name: String) {
		self.name = name
	}
	deinit { println("\(name) is being deinitialized") }
}
 
class CreditCard {
	let number: UInt64
	unowned let customer: Customer
	init(number: UInt64, customer: Customer) {
		self.number = number
		self.customer = customer
	}
	deinit { println("Card #\(number) is being deinitialized") }
}
  • unowned를 사용하는 코드

  • Apartment 클래스에서 tenant 변수는 옵셔널로 사용하기 때문에 순환 참조를 피하기 위해서는 weak로 사용
  • CreditCard 클래스에서 customer 상수는 항상 값을 가지고 있어야 하므로 순환 참조를 피하고자 unowned로 사용