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 문서를 읽어보시길! ;)



WWDC 08 - #2

10 06 2008

안녕하세요. Jenix 입니다.
다들 키노트는 즐겁게 보셨는지요? ㅎㅎ
저는 일이 바쁘다보니, 밤새서 보진 않고, 지금도 보지않고 ㅋㅋ 요약만 대충 들었습니다.

늘 그래왔듯이(?) 제 블로그에선 다른데선 다 볼 수 있는 내용은 배제하구요.
하나씩 벗겨(!!)봅시다!!
그 전에 광고 하나 -_-


iPhone 3G !!
한국은 커밍순 리스트에도 없더랬죠.
많은 분들이 실망하셨으리라 봅니다.
일단 한국 출시에 관련해선 전 언급을 피하겠습니다만.
간절히 바란다면 나오지 않겠습니까? ㅎㅎ
일단 iPhone 3G 국내 언급에 관해선 저에겐 묻지 말아주세요.
재미없죠? 음. 네. 저도 말못하니까 재미없네요. 흑흑.

Mac OS X - 10.6 ??
여기서부턴 WWDC 행사를 참관하는 사람들과 애플과 NDA 에 위배되는 내용입니다만,
뭐 저야 이번엔 가지도 않았고, 제가 말한다고해서 큰 문제가 될까요? ㅎㅎ
이미 여기저기서도 루머성으로 조금씩 돌고 있습니다만. 정리를 해보죠.

“10.6 에서 UI 큰 변화는 없다!! 대신 기반을 완전히 다진다!!”

요게 10.6 의 주 내용이랍니다.
기반을 어떻게 다지느냐?

1. Good-bye Carbon! 굿바이 카본!!
카본을 완전히 걷어낸답니다. (드디어…) 짝짝짝.
10.6에선 파인더도 완전히 코코아로 작성될 예정이구요.
카본 안녕~~

2. 시스템 애플리케이션의 64비트 화.
완전한 64bit OS 를 위해, 시스템 애플리케이션들도 모두 다 64bit 로
이주한다고 합니다. 음. 뭐 지금이야 64bit 에서 이득을 보는게 없지만,
완전한 64bit 환경이 되고 더 CPU 성능, GPU 성능도 발전을 한다면
64bit 에 미리 대비하는 것도 좋겠지요 :)

3. openCL - Open Compute Library ( NOT Crypto Library! )
openCL 이란 기술을 새로이 선보입니다. 애플-인텔-엔비디아 등 회사들과
손잡고 공개된 표준 - 오픈 스탠다드!! - 로 만들고 있는데요,
응용프로그램 - openGL 의 중간단, 즉
응용프로그램 - openCL - openGL 요렇게 중간에 낑궈 들어가서,
CPU와 GPU 파워를 풀로 이끌어내어주는 라이브러리랍니다.
WWDC 에서 보여준 데모는, 별 16000개 사이의 중력 시뮬레이션을 보여주었는데요,
2GFlops 였던 성능이 openCL 라이브러리를 거치면 240GFlops 로 늘어난다고 합니다!
(단순 수치만으로도 240배인데.. 음. 과장하는걸 좋아하는 애플임을 감안해도.. 꽤.. !!)
멀티코어 CPU, 멀티코어 GPU 등을 완전히 이용할 수 있도록 도와준답니다.

요렇게 3가지 내용을 전해들었습니다.
( 고마와요. P군. 한국오면 맛난거 먹자. ^^; )
기타 잡다하게 MobileMe (요건 정말 제가 기다리던건데.. !! 나중에 따로 리뷰 :))
iPhone SDK Beta 7 등의 발표 등등이 있었습니다만,
기타 다른 블로그에서 쉽게 볼 수 있는 내용이라 패스하겠습니다. :)



WWDC 08 - #1

8 06 2008

WWDC08

내일이면 WWDC 08이 시작되네요.
이딜왕시님, 성관님과 WWDC 행사장에 도착하였습니다! ^^

… 는 아니고요… OTL
이번엔 회사 일 때문에 어쩔수 없이 못가게 되었습니다. 흑흑.
(작년에도 회사때문에 못가고. 에효 ㅠㅠ)
내년엔 꼭 가려구요. 히히. 내년 4월이면 병역특례도 끝나고!! 자유롭게!!

음, 뭐 크게 기대되는건 없고요.
아, 왕시님이 WWDC 기념품은 저에게 선물!!로 주신다고 하여, 크크크.
(왕시님. 제 블로그 보고 계시죠? :D 기다리겠사옵니다.)
요건 기대 중.

키노트는 뭐, 화요일 오전에 일어나서 보지요 뭐 ^^
다만, 예전에 iSight 를 나눠줬던 것처럼 iPhone 을 나눠준다던가 하는 만행(?)을
애플이 저지른다면, 이번에 가지 못한 것이 엄청나게 안타깝겠지만,
제작년 WWDC ( 06년도 WWDC )부터 애플이 하는 것을 보면 절대! 그럴리가 없기때문에, 크크

세션 동영상도 위엣분들 다녀오시면 하드만 하나 들고가서 슥삭 해와서
전 집에서 발뻗고 편히 보렵니다 -O-;;



Inside Xcode #1

4 06 2008

Xcode 와 Subversion 을 함께 쓰는 방법에 대해선 웹에 꽤 많은 문서들이 있습니다.
하지만 정작 중요한 사실 몇 가지는 안가르쳐 주더라구요. =_=
바로 Xcode 프로젝트 번들 파일안에 있는 mode1 파일과 pbxuser 파일!

처음 프로젝트 만든 것을 아무 생각없이 통채로 Subversion 에 import 하게되면,
매번 커밋할때마다 Xcode 관련된 알 수 없는 내용들이 같이 반영되어,
각 리비젼 Diff 를 확인하려하면 꽤나 골이 아파지는 현상이…

결론부터 말하자면, Xcode 프로젝트 아래에 “ProejctName.xcodeproj”란 번들 안에
mode1 파일들과 pbxuser 파일들을 Import 하지 않으면 됩니다. :)
만약 이미 커밋이 되어있다면 간단한게

# cd Project.xcodeproj
Project.xcodeproj # svn rm *.mode*
Project.xcodeproj # svn rm *.pbxuser
Project.xcodeproj # svn ci -m "OUT!!"

해버리면 되겠지요 :)
자 여기서. 잠깐 광고 하나 보고.. -_-..

하하하.. 저도 호스팅비는 벌어야죠 (…)

그럼 위 두 파일들은 무엇일까요?

도대체 pbxuser 파일엔 뭘 저장해? - Apple 관계자의 말을 들어보겠습니다.

  • Scott Tooker (Apple): “the locations for built products and intermediates files.”
  • David Ewing (Apple): “The currently active target, executable, and build style are all stored in the file … Other information includes window/view sizes, bookmarks, breakpoints, custom executables, smart groups and code sense settings.”
  • 흠흠. 그렇군요. 빌드와 관련된 잡다구리 파일들과 현재 빌드 타겟, 북마크, 디버깅을 위한
    뷁포인트등이 저장되는 곳이였네요. 이런 것들을 공동 작업자와 공유할 필욘 없겠지요?
    (게다가 파일은 Username.pbxuser 로 저장되서 이를 하나하나 커밋하다간 공동 작업자
    수만큼 파일이 불어난답니다~ -O- )

    그러면 mode1 파일은? - 역시 Apple 관계자의 말을 들어봅시다.

  • Scott Tooker: “The .mode1 file contains layout information for the project (like window positions and sizes, including sizes of sub-views and the like).”
  • Scott Tooker: “[T]he various *.mode* files track information about your workspace configuration. It’s nothing critical to the project so it is safe to throw them away.”
  • 예. 뭐 우리가 주목할 점은 마지막 줄, “It is safe to throw them away” 군요. 흐흐.
    갖다버리고 머리아픈 Subversion Diff 에 고민하지 맙시다!!