본문 바로가기
Swift

7. 메모리 관리

by 루에 2015. 10. 5.
반응형

ARC(Automatic Reference Counting)


객체를 소유한 전체 개수를 파악하기 위한 레퍼런스 카운트(Reference Count)가 있다. 이 레퍼런스 카운트를 자동으로 관리하는 기술이 ARC이다.


레퍼런스 카운트는 클래스에 기반한 레퍼런스 타입에만 적용된다. 원시 타입이나 구조체(Struct), Enum타입은 ARC대상이 아니다.



소유하기


객체를 소유하는 방법은 강한 포인터로 객체를 참조하는 것이다.

var obj : MyClass? = MyClass()  // 소유권을 해제하려면 nil 할당해야 하므로 옵셔널이나 강제 언래핑으로 선언


obj = nil   // 소유권 해제


소유권을 해제하는 것이 객체 해제를 의미하지는 않는다. 객체를 소유하는 포인터가 다수일 수 있다. 이 경우 객체를 생성한 포인터를 nil로 할당해도 객체가 해제되지 않는다.

var obj : MyClass? = MyClass()


var obj2 = obj

obj = nil


obj     // nil

obj2    // MyClass



강한 순환 참조(Strong Reference Cycles)


두 클래스가 서로 참조하는 경우 발생한다. 상호 참조하는 경우 두 객체는 ARC에 의해서 해제되지 않는다.

class A {

    var b : B?

    

    deinit {

        print("A class deinit")

    }

}


class B {

    var a : A?

    

    deinit {

        print("B class deinit")

    }

}


var a : A! = A()

var b : B! = B()


a.b = b

b.a = a


a = nil     // nil v2.0 over

b = nil     // nil v2.0 over



소유하지 않는 포인터 약한 참조(weak pointer)


객체를 소유하지 않는 포인터로 weak와 unowned가 있다.


weak


포인터가 참조하고 있던 객체가 해제되면 자동으로 nil이 된다. 그러므로 옵셔널로 선언해야 한다.

class Person {

    var phone : Phone?

}


class Phone {

    weak var owner : Person?

}


// 상호 참조

var owner : Person? = Person()

var iphone : Phone? = Phone()


owner = nil     // 상호 참조 해도 자동으로 nil 된다.

iphone = nil


unowned


weak와 같이 객체를 소유하지 않는 약한 참조지만 옵셔널로 선언하지 않고, 자동으로 nil이 되지 않는다.


unowned를 사용하는 경우는 수도와 국가, 신용카드와 신용카드 소유자 같은 경우가 대부분이다.



콜렉션과 소유권


콜렉션에 객체를 저장하면 콜렉션은 객체를 소유한다.

var obj3 : MyClass? = MyClass()

var array = [obj]

obj3 = nil  // 객체가 해제되지 않음


array.removeAll()   // 해제됨








반응형

댓글