이번 강좌는 iPhone에서 각 애플리케이션들이 메모리를 관리하는 방법을 설명해 볼까 합니다. 기본적으로 Objective C에서는 Ref-counter를 사용해서 메모리를 관리합니다. COM을 생각해 보면 COM을 사용하는지 않아는지 참조 카운터를 통해서 확인을 하죠, DLL의 경우 AddRef ReleaseRef를 통해 카운터를 +,- 해주고 0이 되면 Unload 하는 방식으로... 동일하게 Objective C에서도 객체에 대한 메모리 관리를 참조 카운터로 해줍니다. CString을 복사하면 Ref 만 늘린건지 객체 자체를 복사한 건지 확인 할 수 있다. 이처럼 NSObject를 상속 받은 객체들은 기본적으로 이 기능을 제공한다.
alloc : 간단히 객체를 생성 후 반환
copy : 기존의 객체를 복사한 후 Ref = 1로 변경
retain : 참조 권한 획득으로 Ref++ 해줌
release : Ref-- 해줌
autorelease : 음 이건 auto release라고 메모리를 관리하는 pool이 mac os상에 있다. 예를 들면 A라를 객체를 생성을 하고 autorelease 속성을 주면 따로 release 하지 않더라도 특정 시점 ( iphone 개발 동영상에서 본거 같은데 다시 볼려니까 귀찮고 그냥 기억 나는데로 말하면 ) 에 자동으로 ref를 내려서 메모리를 해지 한다는 것이다. 가비지 컬렉팅하고 비슷한 개념이다. 애플리케이션이 종료하는 부분이나 메모리 부족한 시점에 동작하는 것 같다. 물론 개발자가 auto release를 원하는 시점에 동작할 수도 있다.
지금까지 메모리 동작을 알아 보았다면 실제로 alloc 하는 코드를 만들어 보자. 이전 예제에서 많이 보았듯이..
id testObj = [[TestObject alloc]init];
으로 생성 및 초기화를 해준다.
반면에 해제는 ...
[testObject release];
로 해제해 준다.
[testObject retain];
한 경우에는
[testObject release];
를 꼭 해줘야 합니다.
아 auto release를 사용하는 이유가 또 있다. 예를 들어 function에서 alloc으로 객체를 생성하고 반환한다면, 어느 시점에서 release를 해줘야 할까? return하기 전에 바로 release 이건 좀 곤란하고 return 하고 나서 전달 결과를 전달 받은 함수에서? 이것도 좀 곤란하고 이럴 때 auto release를 사용하면 우선 생성한 객체를 return 하고 나중에 알아서 mac os상에서 release 해주게 한다.
참고 : 여기 훌륭한 예제가 있네요. 저는 게을러서..ㅎㅎ http://maclove.pe.kr/tag/autorelease
참고로 Stanford에서 만든 iPhone 개발에 관한 동영상을 itune에서 다운받아 보시면 잘 설명해 줍니다. 아! retain과 release를 짝을 안맞추면 어떻게 된다는 설명도..ㅎㅎ
http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html#//apple_ref/doc/uid/TP30001163-CH22-105377
이렇게 Objective C에 대해서 설명을 간략하게 했으니, 다음에는 Xcode와 Interface Builder에 대해서 설명하도록 하겠습니다.

