iPhone App’s Memory Management

19 06 2008

안녕하세요. Jenix 입니다.
오늘은 문득 생각난, iPhone 애플리케이션의 메모리 관리에 대해 끄적여볼까 합니다. 음.. 이제 한달이 조금 넘었는데, 사실 한달전에 OSXDev에서 Mac/iPhone 개발에 관한 세미나를 열었었습니다. 그 당시 저는 iPhone Overview 파트를 담당했는데 이런 내용을 얘기했었습니다.

“비록 iPhone 개발에 Xcode3 를 사용하지만,
iPhone 에서는 가베지콜렉팅이 되지 않으므로,
Objective-C 1에서 사용했던 release/retain 메커니즘을
잘 이해해야 한다.”

예. 제 생각은 지금도 변함없구요. 당연히 그래야 한다고 생각합니다.
하지만 세미나날 당시에, 다른 파트 발표를 담당하셨던 분이,
“AutoreleasePool 을 이용하면 release/retain 같은 고민을 안해도 된다”
라고 과감하게 말씀해주셨는데, 사실 이는 틀린 내용입니다.
그날 당시 정정을 하고 싶었지만, 행사 진행 중인지라 후에 개인적으로 블로깅이나
해야겠다고 생각하고 접어두었다가 오늘에서야 생각이 났거든요 :)

iPhone OS 는 기본적으로 MacOSX 을 포팅한게 맞습니다만,
여기엔 Disk Swap 이 존재하지 않습니다. 따라서 메모리 사용에 굉장한 주의를 요하는데요,
그래서 Apple 쪽에선 메모리 사용과 관련하여, 과한 메모리를 사용하면 노티피케이션을
날려주는 시스템을 취하고 있습니다.

만약 단순하게 AutoreleasePool 만을 믿고,
해당 스코프안에서 과하게 메모리를 사용하게 된다면?
결과는 어찌될지 알수 없습니다. 흐흐. iPhone SDK 를 정식구매하게 되면
한번 직접 올려서 어찌되나 확인해보고 싶네요. 아직 SDK 구매를 하지 않은 관계로…
Apple 의 문서에서도 AutoreleasePool 의 사용은 “지양”하고 있습니다.
직접 할당한 객체들을 직접 release/retain 하여 사용하지 않는
객체는 바로바로 릴리즈 해주라는 얘기입니다. :)

또한 추가적으로 Apple 에서 권장하는 바는, 자신이 사용하는 데이터 용량이 좀
크다 싶으면 SQLite 를 통해서 데이터 입출력을 권장하네요.
많은 데이터를 plist 안에 저장을 해서, 메모리에 많은 데이터가 올라가 있지 않도록 :)

이 외에도 메모리 관리에 필요한 것들은, 음. 어찌보면 모바일 환경에서
개발을 많이 해보신 분들은 다들 사용할 법한 내용들입니다.
UI 의 리소스들은 꼭 필요할때만 로드해서 사용하고, 해당 UI 가 사라지면
리소스도 바로 해제 하는 것과 같은 팁들이겠죠.

메모리 관련하여 내 애플리케이션이 좀 많이 사용할 것 같다 싶으면 다음과 같이
노티피케이션을 받아와서 처리할 수 있도록 하면 됩니다.
우선 UIApplicationDidReceiveMemoryWarningNotification 노티피케이션을 등록을 하고,
applicationDidReceiveMemoryWarning: 을 애플리케이션에 구현하고,
UIView 에서 didReceiveMemoryWarning 메서드를 오버라이딩해서 메모리 사용이 과하게
증가하였을 때 이를 처리해주면 OK!

자세한 사항은 Apple 문서를 읽어보시길! ;)


Actions

Informations

2 responses to “iPhone App’s Memory Management”

19 06 2008
cliff3 (14:00:45) :

글 잘읽었습니다.
가끔이지만, 진형님의 책 (cocoa)도 잘 보고 있구요.

궁금해서 그러는데, iPhone SDK를 구매해야 하는것인가요?
제가 알기로는 현재 Xcode에 포함되어 배포되는 것으로 알고 있거든요.
즐거운 하루 되세요~~ :-)

5 07 2008
Idiel (02:02:20) :

졸리다;;
iPhone개발은 언제쯤 본격적으로 시작하려나;;;

Leave a comment

You can use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>