2013년 12월 12일 목요일

4장(메모리 관리)

Objective-C도 C이기 때문에 메모리 관리가 중요하다. C 개발할 때부터 메모리 문제 발생하면 디버깅할 때 무진장 머리 아프다고 생각해서, 메모리 문제는 가장 중요하게 체크 하고 웬만하면 이런 상황을 만들지 않거나 최소화하려고 노력해 왔다. 때문에, 예전 Objective-C 책이나 iPhone 개발 책을 볼 때 가장 주의 깊게 본 부분이다.

그동안 iOS 개발을 하지 않아서 Objective-C에서 특징적인 메모리 관리 부분을 다 잊어버리고 있었는데, 4장에서 아주 쉽게 떠올릴 수 있게 도와주었다. 그리고 iOS5에서 ARC가 왜 필요한지에 대해서 이해하게 되었다. ARC 처음 볼 때는 좋은 점을 몰랐는데, 요즘 iOS WRT 급하게 만든 경험으로 ARC가 프로그램 구현에서 많은 부분을 도와주었다는 것을 깨닫게 되었다.

4장에서는 ARC 부터 시작 하지 않고, 예전 고전적인 메모리 할당, 해제 부터 시작하고 있는데 ARC 를 제대로 이해하기 위해서는 이 부분이 상당히 중요하다. ARC 란게 컴파일러가 자동으로 코드를 넣어 주는 것이기 때문에, 고전적인 메모리 관리에 대해서 알고 있어야 ARC 결과에 대해서 개발자가 상상을 할 수 있다.

예전에 공부한 것과 더불어 복습을 하자면 메모리 관리의 룰은 다음과 같다.

[reference count 가 증가 하는 경우]

  • alloc
  • new
  • copy(mutableCopy 포함)
위의 세 가지 경우는 무조건 reference count 가 증가 한다. 또한 개발자가 강제로 reference count 를 증가 시키려면 retain 을 사용하면 된다.

reference count 가 증가한다면 반대로 reference count 를 감소 시켜 줘야 하는데, 이럴때 사용하는 것이 release 이다. 고전적인 메모리 관리는 위의 세 경우 일때는 쌍을 맞추어서 release 를 시켜 줘야 한다.

또한 NSArray object 와 같은 경우는 object 를 array 에 push 할때 자동으로 add 되는 object 를 retain 시키고, pop 할때 자동으로 release 시키게 된다.(NSDictionary 등 기본으로 제공되는 object set 인 경우는 언급 하지 않았지만, 동일하게 retain, release 하게 될 것으로 예상 된다)

autorelease 에 대해서, 이게 정말 제대로 이해가 되지 않았는데 이번에 어느 정도 이해하게 되었다.(주위에 OSX 개발자가 없어서 제대로 이해한 것인지 자신은 없지만, 추후 개발 할때 알게 될 것으로 생각하며 제대로 이해 했다고 그냥 생각 하자 ^^;)

autorelease 로 release 된 것은 release 예약이라고 볼 수 있는데, 예약 해 둔게 과연 어느 시점에 실행될지 정확하게 이해하지 못했는데, "이벤트 루프의 끝" 이라는 말에서 정확하게 이해 되었다. 

java 에서는 object 의 메소드 호출이라고 말을 하는데, Objective-C 에서는 메소드 호출이 아니라 object 로 메시지를 보낸다고 말을 한다. 결국 object 로 메시지 이벤트를 발생 시키는 것으로 보여진다. 즉, "이벤트 루프의 끝" 이란 것은 object 로 메시지 보낸 것이 완료 되었을때 라는 말과 동일한 것이 아닐까 한다.

그리고 임의로 autorelease pool 을 사용하는 이유는 개발자가 임의로 autorelease pool 을 만들고, 임의로 생성된 autorelease pool 에 autorelease 를 예약하고 이벤트 루프가 끝나기 전에 예약된 release 를 실행 시키기 위해서라고 보여 진다.

마지막으로 ARC 에 대해서...iOS 개발에 대해서 제대로 공부 하기 시작 했을때가 iOS5 때 부터 였다. ARC 가 최초로 적용 될때 인데, 그때 다른 개발자의 블로그를 보면 "이해하기 힘들다", "사용하기 힘들다", "코드가 상상이 안간다" 등등의 이유로 ARC 를 사용하지 않고 개발을 한다는 말이 많았는데, 물론 라이브러리 들이 ARC 로 되어 있지 않다는 것도 큰 이유 중의 하나 였다.

그런데, 그 당시 그냥 스치고 지나간 말인 ARC 를 사용하므로 인해 reference count 보다는 "객체의 관계" 에 더욱 신경 쓸 수 있다는 말이 있었다. reference count 는 그냥 프로그램 코딩상의 관점이고, "객체의 관계"는 좀 더 고차원적인 설계의 문제이다.(어떻게 보면 같을 수 있지만......^^;) 아무튼 좀 더 폭 넗게 생각해서 프로그램을 할 수 있게 되었다는게 중요하다.

아무튼 4장도 다시 공부를 시작하는 입장에서 예전 기억을 떠올리는 많은 도움이 되었다.

댓글 없음:

댓글 쓰기