오브젝티브C2016. 6. 20. 11:16






오브젝티브의 메모리 사용은 사물함을 사용하는 것에 비유할 수 있다.

만약 여러 명이 같이 공용으로 사용 가능한 사물함이 있고 이 사물함을 사용한다는 사람이 있으면 관리사무소에서 사물함을 설치하고 아무도 사용하는 사람이 없으면 사물함을 회수한다고 하자.


1. 예를 들자면 사물함을 철수가 사용한다고 최초로 신청하자 관리사무소에서는 사물함 하나를 철수를 위해 설치한다. 이 사물함을 사물함A라고 하자. (alloc으로 메모리를 할당받는 것이다.) 

2.  관리사무소에서는 사물함A을 사용하는 사람이 1명 있다고 적어놓는다. 관리사무소에서는 다른 정보는 필요가 없고 사물함을 사용하는 사람의 수만 알면 된다. (리테인 카운트가 1이 된다.) 

3. 영희가 자신도 사물함A을 사용하고 싶다고 관리사무소에 신청한다.(retain 메소드 사용) 그러면 관리 사무소에서는 사물함A를 사용하는 사람 수는 2명으로 적어 놓는다. (리테인 카운트가 2가 된다.)



4. 철수가 관리사무소에 자신은 더 이상 사물함A을 사용하지 않겠다고 관리사무소에 말한다. (release 메소드의 사용) 그러면 관리사무소에서는 사용하는 사람 수를 2명에서 1명으로 다시 기록한다. (리테인 카운트가 1이 된다.)

5. 영희도 관리사무소에 자신은 더 이상 사물함A을 사용하지 않겠다고 관리사무소에 말한다. (release 메소드의 사용) 그러면 관리사무소에서는 사용하는 사람 수를 1명에서 0명으로 다시 기록한다.  (리테인 카운트가 1이 된다.)

6. 사용하는 사람 수가 0명이 된 것을 확인한 관리사무소에서는 사물함A를 회수한다. (dealloc 메소드의 사용, 레퍼런스 카운트가 0이되면 객체는 자동으로 dealloc메서드를 호출한다.)


위의 과정에서 만약 영희가 관리소에 말도 하지 않고 사물함A을 사용하고 있는 경우 철수가 사물함A를 그만 사용한다고 관리사무소에 말하면 영희가 사물함A를 사용하고 있는 걸 모르는 관리사무소에서는 사물함A를 회수하는 문제가 발생한다. 이는 객체A가 객체B로 변수를 전달했을 때 객체B가 레퍼런스 카운트를 늘리지 않고 변수를 사용 중에 객체A에서 해당 변수를 릴리즈를 해버리면 객체B에서 문제가 생기는 상황과 같다.(객체가 아닌 메소드라고 해도 동일하게 적용될 수 있다.)