본문 바로가기

General/iOS

[iPhone] Memory Management


CS 193P iPhone Application Development


2010년 가을학기 스탠포드 아이폰 애플리케이션 개발 
강의 자료를 바탕으로 작성합니다.
 강의동영상 및 강의자료(Lecture-4)의 내용들입니다.

강의자료는 위 링크를 통해 다운 받을 수 있습니다.
(강의자료를 그대로 옮겨적은 것에 불과할 수 있습니다.)
(의역/오역된 내용이 있을 수 있습니다. 그런 경우 말씀해주세요.)




 Reference Counting

(이전글과 연계해서 - 이전글: [iPhone] Object - creating / initializing / getting)

Creating(or getting)한 Object들을 Heap에서 free하게 해주기 위해서, 
Reference counting이라는걸 하게 됩니다.




Object-c 에는 Garbage Collection 개념이 없기때문에,
Reference counting(참조 수)을 이용해서, 
더이상 사용하지 않을(Reference counting 이 0인) 메모리를 반환해 줍니다.


Reference counting 이 0보다 크다면(1 이상), 그건 사용되고 있는 메모리이므로 반환하지 않습니다.
Reference counting 이 0이 되면, 이 메모리는 더이상 사용하지 않는다고 판단되므로 Heap영역으로 반환해 주는 거죠.

하지만, 자동적으로 Reference counting 이 처리되지는 않기때문에 (알아서 + 되고 알아서 - 되지는 않는다.)
프로그래머가 직접 Reference counting 에 대해서 처리를 해주어야 합니다.

즉,
내가 이 메모리를 사용하겠다면 해당 메모리에 대해서 Reference counting 을 올려주고,
사용이 끝났다면 Reference counting 을 내려주어야 한다는 이야기지요.

간단하군! 이라고 생각할 수 있지만,
모든 언어들이나 플랫폼들을 공부하면서 그러했듯이,
Reference counting을 올려주고 내려주는 것에도 몇가지 룰이 있습니다. 

아래에서 그 룰들에 대해서  알아보도록 하겠습니다.



 Object Ownership

다시 정리해 봅시다.

Object를 Creating하면, Object는 Heap에 memory(메모리)를 할당 받게 됩니다.
우리는 이 Object를 올바르게 사용하기 위해서, Reference counting을 통해,
해당 Object가 사용하고 있는 memory에 대한 관리를 해줍니다.

어떤 Object를 사용하기 위해서는 해당 Object에 대한 Ownership(소유권)을 얻어야 합니다.(getting)

그럼 Object에 대한 Ownership은 어떻게 얻을 수 있는 걸까? 라고 생각하겠지만,
이미 위에서 어느정도 얘기를 해버린, Reference counting 을 1 올려주는 것이 바로 Ownership을 얻는 방법이죠.
(한마디로 말하면, 내가 이 Object 쓰고있다~~~ 라고 표시를 해두는 것입니다. 다 쓰면 표시를 지우는거죠.)

그럼 여기서 다시 궁금한게 생겨버립니다.
Reference counting은 어떻게 증가시켜야 되는 거지?

어떤 Object를 alloc/init을 통해서 생성했다고 해봅시다. 그럼 그 순간 해당 Object의 Reference counting이 자동으로 1 증가합니다. 이렇게 되면 이 Object에 대한 Ownership을 획득한 것이죠. 맘대로 쓸 수 있다는 얘깁니다.

그럼 다른 곳에서 생성한 Object를 사용하고 싶은 경우에는 어떻게 할까요?
이럴때 사용하는 것이 retain 이라는 녀석입니다. ( R E T A I N )

Object에 reatin 이라는 message를 sending하면(메시지를 보내면 : 메소드를 호출하면) 해당 Object의 Reference counting이 1 증가하게 되고 이 Object에 대한 Ownership을 획득할 수 있게 됩니다.
Object를 alloc/init을 사용해서 생성하지 않고도, Object를 사용한다는 표시를 할 수 있게 되지요.



이제 Object를 사용하기 위해  표시하는 방법(Reference counting을 증가시키는 방법 / Ownership을 얻는 방법)은 알고 있습니다.

이번에는 Object를 사용한다고 표시해둔것을 지우는 방법을 알아볼 차례입니다. 
사용 표시해둔것을 없애는 방법, Reference counting을 1 감소시키는 방법은 release입니다. ( R E L E A S E )
Object에 release라는 메시지를 sending하면 Reference counting(또는 retain count)이 1 감소합니다.

(주의할 것은 Own 하고 있지 않은 Object에 대해서 release message를 send하지 않아야 하는 것입니다.)



 Temporary Ownership

곧 작성합니다.


 Autorelease & Collections

곧 작성합니다.


 Other Ownership Rules

곧 작성합니다.


 Deallocation

곧 작성합니다.


 @property

곧 작성합니다.