본문 바로가기

카테고리 없음

아이폰 Objective-C 메모리 관리 (수동변속기와 자동변속기)

친구로부터 중고차를 샀다. 차 사기전에 친구가 말했다. 수동인데 괜찮겠어? 나야 일종인데 상관없지~ 그래서 친구차를 저렴한 가격에 샀다. 그러나 수동 초보운전이 얼마나 힘들지 절감했다. 수동 초보 운전은 무서웠고 어려웠다. 사람들이 괜히 오토를 좋아하는게 아니구나라는 것을 알았다.

근데 운전이 조금 익숙해지니 수동의 장점이 보였다. 일단 재밌다. 마치 레이싱 게임하는것 같다. 연비도 더 좋고 수리비도 적게 든다고 한다. 그래도 막힌길이나 언덕길은 힘든것도 사실이다. 무엇보다 수동의 장점은 내가 내 차를 내 맘대로 컨트롤 한다는 자부심을 얻는 것이다. 이건 조금 실용성 없는 장점이긴 하지만 많은 수동 운전자들이 이 뿌듯함 때문에 수동운전을 좋아하는것 같다.

요즘 아이폰 개발에 Objective-C를 쓰면서 느낀 불편함은 메모리 관리를 신경써야 한다는 것이다. 자바는 다 알아서 해주는데 오브젝티브시(Objective-C)는 왜 이렇게 해야하는지 이해가 잘 되지 않았다. 일단 메모리 관리는 신경쓰지 않고 자바개발하듯 내가 만들 어플 기능 몇개 완성한 다음에 메모리 관리를 한방에 손 보기로 했다.

어플을 어느정도 개발하고 하루 날잡아 메모리 관리를 하는날은 제대로 삽질하는 날이었다. 책에서 설명하는 메모리 관리 기법은 이해가 안되었고, 인스트루먼트라고 하는 메모리누수체크 유틸리티는 빨간 경고를 계속 강조했다

그날 어떻게든 메모리 누수를 다 막고 쉬는 중 께달았다 자바의 메모리 관리가 자동 변속기라면 C언어는 수동 변속기이구나~!

자바는 메모리 관리를 알아서 다 해주기 때문에 무척 편리하다. '사실은 메모리 관리를 알아서 해주는게 편한지'조차 몰랐다. 대신 메모리를 관리해주는 가비지컬렉터가 개발자의 수작업 보다는 느리고 쓰는 비용이 크기 때문에 조금 비효율적이다. 오토운전 또한 수동운전에 비해 엄청 편리하지만 부품이 복잡하고 처리방식이 복잡하여 연료나 수리비는 더 많이든다

오브젝티브시(Objective-C)는 메모리 관리를 개발자 스스로 해야하기 때문에 초기 학습 비용이 크고 개발자의 손이 더 가게되서 번거롭다. 대신 개발자가 원하는데로 객체 라이프사이클을 빠르고 정확하게 통제하기 때문에 프로그램이 가벼워지는 큰 장점이 있다. 수동운전 또한 초기 학습비용이 크고 운전자의 손이 많이 가지만 자동차 부픔이 간결하고 가벼워지며 운전자 마음대로 차를 컨트롤 하는 장점이 있다.

사실 나는 이번 메모리관리를 하면서 프로그램이 가벼워지는 효과보다도 내가 만든 객체를 스스로 통제할 수 있다는 자부심~ 뿌듯함~ 비슷한걸 느꼈다 마치 진정한 고수는 객체 라이프사이클도 통제할 수 있어야 한다는 그런 으쓱한 기분은 수동 운전자의 자부심과 비슷했다.

사실 오브젝티브시(Objective-C)의 메모리관리는 진정한 수동변속기는 아니다. 정확히 말하면 수동과 자동 변속기를 혼합한 하이브리드 변속기와 같다. 오브젝티브시(Objective-C)는 어느정도 메모리를 자동으로 관리해주는 개념을 갖고 있다.

+ 오브젝티브시(Objective-C) 메모리 관리 기본 설명
일단 아이폰 개발자의 유명한 카페 '맥부기' 카페를 가입하고 '문씨'라는 분의 메모리 강좌를 읽는다. 내가 서점가서 아이폰, 오브젝티브시 관련 서적을 몇권 읽어봤는데 이 분의 강좌보다 못한것 같다. (이분의 강좌로 설명 때웁니다. ^ ^;)

+ 오브젝티브시(Objective-C) 메모리 관리 기본규칙
1. 함수내에서 쓰는 객체들은 전부 오토릴리즈(autorelease)로 한다.
      1. alloc init 과 release무더기면 코드만 해맨다
2. 전역 변수는 지정할때 리테인카운트를 하나 올린고 안쓸때 해제한다.
      1. 계속 가지고 있을것이니 retain, 더이상 안쓸때는 release!
3. 전역 변수에 객체를 사용하다가 해제(release)를 하면 미련없이 nil처리 (변수 = nil;)하자
      1. release하고나면 반드시 변수 = nil; 해서 이후에 실수로 접근해도 문제없다.
4. 프로퍼티는 전역 변수가 아니다!
      1. self.title과 title, 헤깔리지 말자.
5. 다른 객체에 전달하는거, 알아서 하겠지. 신경쓰지 말자.
      1. NSMutableArray같은 관리 객체에 넣어둔거 해제될때 알아서 내용도 해제 시킨다.
6. retainCount함수로 일일이 확인해보지 말자 괜히 헤깔린다.
      1. 상황에 따라 예상보다 더 나오는 경우도 있습니다 그만큼 더 해제 시킨다고 해매지 마세요.
7. 내가 만든 함수도 객체를 돌려줄땐 오토릴리즈로 돌려주자
출처: 문씨의 메모리강좌(1) http://cafe.naver.com/mcbugi/71504

나는 위의 규칙을 명확히 이해하고 난 후 오브젝티브시의 메모리관리를 이해할 수 있었다. 함수내에서 쓰는 객체들은 무조건 autorelease~! 이것만 명심해도 많은 메모리 관리 고민이 해결되었다.

+ 오브젝티브시(Objective-C) 메모리 관리에 도움되는 두가지 툴
1. 인스트루먼트(Instrument)
x-code를 쓰다보면 메인 에디터툴 말고 유용한 도구가 많이 있는데, 인스트루먼트는 메모리 누수를 체크해주고 기타 여러가지 메모리 관리를 모니터링 해준다. 인스트루먼트를 실행하면 Record 가 되면서 어플이 실행되는데 어플의 이런저런 기능을 실행하다가 누수가 발생되면 빨간 그래프로 누수 현황을 알려준다. 그림 섞은 자세한 설명은 다음 시간에..

2. Build And Analyze 기능 사용
x-code의 신기한 기능중 하나인데 x-code에서 Build > Build And Analyze 를 실행하면 메모리 누수 흐름을 화살표로 보여준다. 그래서 어디를 고쳐야 메모리 누수가 없겠구나 라는것을 짐작할 수 있다. 그림 섞인 자세한 설명은 다음 시간에..

+ 결론
사실 메모리 관리 개념 자체가 없었던 자바 개발자로 처음 Objective-C 쓸때는, 마치 자동차의 수동변속기 다루는 것처럼 어려워했고 무서워하기도 했다. 그러나 위의 메모리 관리 이론을 알고, 메모리 관리 규칙을 알고, 메모리 관리에 도움되는 두가지 툴을 알았더니 전혀 무서울게 없었다. 오히려 메모리 관리를 내가 직접하니 뿌듯했고, 프로그램도 더 효율적으로 거듭나는것 같았다. 오늘은 전체적인 메모리 관리의 '숲'을 설명했고, 다음에는 좀 더 자세한 내용을 설명한다.