'[Objective-C]가비지'에 해당되는 글 1건

  1. 2010.06.22 [Objective-C]가비지 컬렉션
오브젝트C2010. 6. 22. 09:53
[Objective-C]가비지 컬렉션
가비지 컬렉션은 런타임에 불필요한 메모리 영역을 찾아내고 그것을 자동으로 해제하는 매커니즘이다.
흔히 GC 라고 부르며 불필요해진 메모리를 회수하는 루틴을 카비지 컬렉터라고 한다.

가비지 컬렉션은 Objective-C 2.0부터 도입되었다.
회수 대상은 C언어의 변수나 구조체처럼 메모리 영역을 참조하는 포인터는 포함되지 않는다. 회수 대상은 id나 클래스명을 타입으로 사용하는 객체들이다.

가비지 컬렉터는 가장 먼저 해제하면 안되는 객체를 찾게 된다. 외부 변수, 정적 변수가 참조하는 객체는 이 과정에서 해제되지 않게 된다.
또한 해당 시점에서 스택 내의 변수가 참조하는 객체도 해제되지 않는다. 이런 인스턴스들을 루트집합(root set)이라고 하는데 이 루트 집합에 포함된 객체나 그 객체가 참조하는 객체 역시 해제 대상에서 제외된다.
즉 외부변수, 정적변수 및 스택 내의 변수에서 참조관계를 가지는 객체는 해제대상에서 제외되게 된다.

레퍼런스 카운트 방식에서는 더이상 사용하지 않는 객체에 release메세지를 보내는것 처럼 사용하지 않는 객체를 명시적으로 표시했다. 가비지 컬렉션에서는 이러한 상태를 가비지 컬렉터가 판단하기 때문에 개발자는 신경스지 않아도 된다. 하지만 프로그램의 가독성을 생각한다면 사용하지 않는 객체에 nil 을 할당하면 된다.

레퍼런스 카운트 방식에서는 setter메소드에 아래외 같이 기술한다.

-(void) setHelper:(id)obj{
  [obj retain]; //먼저 파라미터를 보존한다
  [heler release];//원래 객체를 해제한다.
  helper = obj;
}

가비지 컬렉터를 사용할 경우 다음과 같다.
-(void) setHelper:(id)obj{
  helper = obj;
}

가비지 컬렉터의 회수 대상이 된 객체는 즉시 해제되는 것이 아니라 가비지 컬렉터가 각 객체에 finalize라는 메세지를 보낸 후 해제되게 된다. 따라서 finalize가 정의 되어 있다면 해제되기 전에 필요한 후처리를 할 수 있다.
finalize메소드는 NSObject 에 정의되어 있다.

가비지 컬렉션을 사용할 수 있는것은 Mac OS X 10.5(LeoparD)이후 시스템 뿐이다.
가비지 컬렉션을 사용할때 컴파일 옵션을 따로 설정해 줘야 한다.

* 옵션 없이 컴파일
- 레퍼런스 카운트 방식을 사용함.
 - 가비지 컬렉션 사용하지 않음.

* -fobj-gc
- 가비지 컬렉션과 레퍼런스 카운트 방식 둘 다 사용

* -fobjc-gc-only
- 가비지 컬렉션만 사용

xcode 사용시 설정


출처 : http://blog.naver.com/PostView.nhn?blogId=khagaa&logNo=30084715607

'오브젝트C' 카테고리의 다른 글

[Objective-C]프로퍼티  (0) 2010.06.22
[Objective-C]클래스 클러스터  (0) 2010.06.22
[Objective-C]가비지 컬렉션  (0) 2010.06.22
[Objective-C]카테고리 예제  (0) 2010.06.22
[Objective-C]메모리 관리  (0) 2010.06.22
[Objective-C] 클래스  (0) 2010.06.22
Posted by 오늘마감

댓글을 달아 주세요