오브젝트C2010. 6. 22. 09:54
[Objective-C]존
Cocoa에서 동적으로 확보된 메모리를 관리하기 위해 Zone이라는 영역을 사용한다.
교과서 적인 메모리 관리방식에서는 동적 메모리 할당을 위해 하나의 큰 힙 영역을 사용하게 되는데 이때 할당과 해제를 반복하다보면 서로 관계있는 데이터들이 흩어질 가능성이 있다. 그래서 메모리 공간에 여러개의 힙을 만들어 서로 관련된 데이터나 객체를 특정 힙 내에 메모리가 할당 되도록 한다. 이렇게 함으로써 공간적인 국소 참조성을 살린 효유적인 메모리 접근이 가능해 진다.
이렇게 메모리 상 만들수 있는 힙 영역을 존이라고 부르며 존은 각각 메모리 관리 기능이 있고 필요에 따라서 크기가 증가된다.
프로그램이 실행된 직후부터 존재하는 존을 default zone이라고 하며 따로 지정하지 않을경우 인스턴스 객체는 이 존에 만들어지게 된다.
존 개념은 메모리 접근의 효율을 위해 만들어진 개념인데 일반적인 경우 default zone만으로도 충분한 효율이 나오기 때문에 Apple문서에서 적극 소개를 하지는 않는다.
또한 가비지 컬렉션을 사용할 경우 객체 생성시 존 지정이 불가능 하다.

일반적으로 alloc을 사용하면 default zone에 생성된다. 존을 지정해서 인스턴스를 생성하려면 allocWithZone을 사용한다.
+(id)allocWithZone:(NSZone *)zone;
zone 이 NULL 인 경우 default zone에 생성된다. 가비지 컬렉션이 동작중일 경우 zone은 무시되고 alloc을 사용하는 것과 동일하게 처리된다.
한 객체가 어느 존에 있는지 확인하는 메소드도 제공된다.
-(NSZone *)zone;

* 얕은복사와 깊은복사
어떤 인스턴스 객체와 같은 내용을 가진 다른 객체를 만드는 것을 일반적으로 복사라 한다. 복사에는 객체에 대한 포인터만 복사하는 얕은복사와 새로운 메모리 영역을 가지는 객체 복사본을 만드는 깊은 복사가 있다.
만일 변수 A가 다른 객체를 참조하고 있는데 변수 A를 복사해서 B로 대입시 포인터만 복사하는 방법이 있다. 이렇게 되면 결과값은 공유하게 된다.
깊은 복사의 경우 A가 참조하는 다른 객체도 복사 하여 복사된 B포인터에 대입하는 방법도 있고 더 나아가 복사된 객체가 참조하는 변수에 대해서도 재귀적으로 복사하는 것도 가능하다.

NSObject에는 copy라는 메소드가 제공 되는데 객체를 복사해 새로운 인스턴스를 만드는 것이 가능하다. 하지만 실제로 복사를 처리하는 것은 copy가 아니라 copyWithZone이라는 메소드이다.
이러한 원리 때문에 인스턴스가 복사되도록 하기 위해서는 copy 가 아닌 copyWithZone메소드를 정의해야 한다.



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

'오브젝트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 오늘마감

댓글을 달아 주세요