2008년 08월 23일
autorelease pool : objective-c
objective-c에는 특이한 녀석이 있다. autorelease pool 이라는 녀석인데, Java나 C#과 같은 언어에서 사용되는 garbage collector과 비슷한데 조금 다르다.
Java 에서는 모든 객체의 해제를 garvage collector가 담당을 한다. 때문에 어쩔 수 없이 성능저하가 일어 날 수 밖에 없는데, 바로 객체가 언제 메모리에서 해제될 지 모르는데, 만약 메모리에서 해제되는 시점이 하필이면 메인 프로그램이 한창 바쁠때라면 순간적으로 성능저하가 일어 날 수 밖에 없다. 왜냐면 메모리에서 해제가 되면서 물리적으로 메모리에 있는 값들이 재정렬 되기 때문이다.
그런데, objective-c에서는 사용자가 직접 autorelease pool에 들어갈 객체를 지정 할 수 있다. 필요한 객체들에 대해서만 autorelease pool을 사용할 수 있기 때문에 훨씬 더 유연하게 사용 할 수가 있게 된다. 더욱이 사용자가 직접 autorelease pool에 들어있는 객체들의 해제를 명령 할 수도 있다!
또한 objective-c에서는 기본적으로 NSObject라는 클래스를 상속받게 되는데(이것도 내 생각에는 아마도 objective-c 라는 언어의 특성이라기 보다는 cocoa framework의 특징이라고 본다. 아무튼) 이 NSObject는 기본적으로 reference counting pattern을 사용한다. 사실 프로그래밍을 하다 나오는 버그의 대부분은 잘못된 메모리 관리에서 기인하는데, 이 autorelease pool과 reference counting은 물론 완벽할 수는 없지만(완벽이라는 것은 우리가 사람이기 때문에 불가능 하다는 측면에서) 버그의 가능성을 줄일 수 있는 여지를 제공한다는 점에서 의미가 있다고 생각한다.
Java 에서는 모든 객체의 해제를 garvage collector가 담당을 한다. 때문에 어쩔 수 없이 성능저하가 일어 날 수 밖에 없는데, 바로 객체가 언제 메모리에서 해제될 지 모르는데, 만약 메모리에서 해제되는 시점이 하필이면 메인 프로그램이 한창 바쁠때라면 순간적으로 성능저하가 일어 날 수 밖에 없다. 왜냐면 메모리에서 해제가 되면서 물리적으로 메모리에 있는 값들이 재정렬 되기 때문이다.
그런데, objective-c에서는 사용자가 직접 autorelease pool에 들어갈 객체를 지정 할 수 있다. 필요한 객체들에 대해서만 autorelease pool을 사용할 수 있기 때문에 훨씬 더 유연하게 사용 할 수가 있게 된다. 더욱이 사용자가 직접 autorelease pool에 들어있는 객체들의 해제를 명령 할 수도 있다!
또한 objective-c에서는 기본적으로 NSObject라는 클래스를 상속받게 되는데(이것도 내 생각에는 아마도 objective-c 라는 언어의 특성이라기 보다는 cocoa framework의 특징이라고 본다. 아무튼) 이 NSObject는 기본적으로 reference counting pattern을 사용한다. 사실 프로그래밍을 하다 나오는 버그의 대부분은 잘못된 메모리 관리에서 기인하는데, 이 autorelease pool과 reference counting은 물론 완벽할 수는 없지만(완벽이라는 것은 우리가 사람이기 때문에 불가능 하다는 측면에서) 버그의 가능성을 줄일 수 있는 여지를 제공한다는 점에서 의미가 있다고 생각한다.
# by | 2008/08/23 18:10 | 개발이야기 | 트랙백 | 덧글(2)
◀ 이전 페이지 다음 페이지 ▶




