'맥프로그래밍'에 해당되는 글 9건

  1. 2009.06.01 Objective-C : Memory Management 1 - Base
반응형
1. Reference Counting
  Cocoa는 reference counting이라는 것을 이용하여 Object 대한 Reference 여부를 판단한다. 이를 retain counting이라고도 한다. Object가 alloc 또는 new 또는 copy message등을 이용하여 생성될때 retain count는 1로 설정 된다. Object에서 사용하는 메모리를 Release 하기 위하여 dealloc method를 override하여 사용하면 된다. 
  retain count 관련하여 다음과 같은 함수들이 있다.

-(id) retain;  // retainCount를 증가 시킨다.
-(void) release; //retainCount를 감소 시킨다. retainCount가 1일때 불리면 dealloc 을 수행한다.
-(unsigned) retainCount; //retainCount를 알려준다

다음은 이를 이용한 예이다.

다음은 수행 결과 이다.


2. Object Ownership and Reference Counting
Object(B)가 다른 object(A)를 가르키는 instance variable을 가지고 있을때 이 Object(B)는 다른 Object(A)를 소유한다고 이야기 한다. Object에 대한 release는 그 object를 소유하고 있는 object가 해결해야 한다.
다음의 Object A,B를 생각해 보자
-> Object A

-> Object B


다음과 같이 main을 작성하면

다음과 같이 segmentation fault가 발생한다. main에서 main 객체와 B_Object는 A_Object를 소유 한다. main에서 aobj를 release 하였는데 이때 B_Object에는 이런 사실이 알려져 있지 않기 때문에 showB에서 없는 객체의 함수를 호출하기 때문에 Segmentation fault가 발생하는 것이다. 결과는 다음과 같다


따라서 access에서 retainCount를 증가 시킬 필요가 있다. 즉 setA_Object 함수를 다음과 같이 구현한다.

그러면 실행 결과는 다음과 같다.

main에서 release를 하더라도 B_Object가 소유하고 있기 때문에 dealloc이 호출되지 않은 것이다. 하지만 main과 B_Object가 release 했음에도 A는 dealloc 되지 않는다.  따라서 release함수를 override하여 다음과 같이 자신이 Reference하고 있는 Object를 release 해줘야 한다. 다음과 같이 release 함수를 override한다.

main함수에서 마지막 NSLog 부분을 제거한다. (없는 Object에 retainCount를 호출하기 때문에 Seg Fault가 난다.)
실행 결과는 다음과 같다

Release시에 A도 같이 제거 된다.
근데 이 setA_Object 함수는 다음의 경우에 문제가 발생한다.

실행 결과는 다음과 같다

setA_Object 를 실행할때마다 파라미터로 들어가는 Object의 retainCount가 하나씩 증가해서 aobj 와 a2obj가 그대로 메모리에 남아 있게 되는 memory leak 이 발생한다.
따라서 setA_Object를 다음과 같이 바꾸면 memory leak이 발생하지 않는다.

그런데 이 경우 newObject가 objReference와 동일 할 경우에 문제가 발생할수 있다. 따라서 다음과 같이 수정한다.


따라서
Ownership과 관련하여 memory leak이 발생하지 않도록 ownser의 set method와 release 메소드를 잘 구현하는게 필요하다.


반응형
Posted by alias
,