CLOSE SEARCH
POSTS TAGGED WITH: Memory

메모리 관리

– 참조 카운트

객체가 alloc 메소드를 통해 메모리를 동적으로 할당받고 이니셜라이저를 통해 초기화를 마치면 해당 객체의 참조카운트는 1이 된다. retain 메시지는 참조 카운트를 1 증가시키고 release는 1 감소 시킨다. 참조 카운트가 0이 되었을 때 객체는 dealloc 메소드를 통해 해제된다.

특정 객체에 retain 메시지를 보내면, 메시지를 보낸 객체는 대상 객체의 오너가 되고, 자신이 대상 객체를 참조하는 동안에는 대상 객체가 해제되지 않는다.

 

– Autorelease Pool

Objective-C는 인스턴스를 자동으로 해제 시켜주는 Autorelease Pool 을 제공한다. NSAutoreleasePool 클래스의 인스턴스를 생성하고 특정 인스턴스에 autorelease 메시지를 보내면 해당 인스턴스는 Autorelease Pool에 등록된다. release 메시지를 보내서 객체를 해제하는 것과 달리 autorelease 메시지를 보내면 객체가 해제되거나 참조 카운트가 변하는 등의 변화는 일어나지 않는다. 대신 Autorelease Pool이 해제되는 시점에 등록된 모든 인스턴스가 해제된다.

 

Autorelease Pool 이 생성되지 않는 상태에서 인스턴스에 autorelease 메시지를 보내면 아래와 같은 메시지와 함께 런타임 에러가 발생한다.

*** __NSAutoreleaseNoPool(): Object 0x100109140 of class NSObject autoreleased with no pool in place – just leaking

iPhone Memory Management

1. alloc, new, copy류의 메서드는 retain된 객체를 리턴하므로 반드시 직접 release를 호출해준다.


2. retain을 호출했다면 반드시 release를 호출한다.


3. 클래스 메소드(+가 붙는 메소드, 혹은 컨비니언스 컨스트럭터)는 autorelease 객체를 리턴하므로 release를 명시적으로 호출할 경우 에러가 발생한다.


4. 자류구조 클래스는 요소를 추가할 때 retain하고 삭제할 때 release하므로 명시적으로 release를 호출할 필요가 없다.


5. @property 에서 retain 속성을 사용했다면 반드시 release를 명시적으로 호출해야한다.


6. 객체를 리턴할 경우 autorelease된 객체를 리턴하는것이 좋다.


7. 인터페이스 빌더와 연결된 객체는 retain 되어 있으므로 반드시 직접 해제해주어야 한다.