앱에 대해 기능을 완성 후 Memory Leack등을 검사하기 위해 Instrument등을 사용하여 확인한다.

하지만 Leack 부분에서는 이상이 없는 특정 상황에서 메모리에 계속 남아있게 되는 현상이 발생된다.

대표적인 예로 Cross Retain 상태인데 아래와 같은 상황이다.

 

보통 저런 관계가 성립되기 위해서는 A Class에서 B Class를 생성 한 후 B Class에서의 결과를 받기 위해 Property retain을 통해 부모를 가르키고 있을 경우 발생된다.

하지만 일반적인 경우 저렇게 부모를 가르킬 경우에는 assign을 통해 참조만 하고 있다면 문제가 생기지 않는다.

그렇지만 요즘 Block Coding을 통해 개발하다 보니 위와 같은 상황이 발생되었다.

@property(nonatomic, copy) void (^executeLoad) ();

이렇게 Block코드를 property를 유지하기 위해서는 copy 키워드를 사용 해야하는데 이때 위와 같은 관계가 성립되어 버린다.

이런 상황은 A Class를 생성했던 부모클래스가 Release 되어도 A, B클래스는 여전히 메모리에 남아있게 되는 상황이 발생되었다.

이를 검사하기 위해 Instrument의 Allocations 도구를 사용하여 확인하였다.

Instrument의 화면이다. 기존까지 단순히 메모리의 증가 감소 현황만 확인하였는데 retain Count를 확인할수 있는 방법을 알고난 부터 엄청 유용하게 되었다.

 

우선 실행되는 Instrument 를 잠시 중단하고 allocations 옆 느낌포를 클릭하면 위와 같은 옵션 창이 나온다

여기에서 Recode reference count를 선택하면 모든 준비는 끝이다.

다시 Instrument를 실행하면 이전과 다른 것이 없어 보이지만 차이점이 존재한다. 

모니터 옵션창에서 Objects List를 선택하면 현재 살아있는 Object의 리스트를 보여준다.

Category를 확인하면 좀더 살아있는 객체를 확인하기 쉽다.

이때 retain Count를 확인하기 위해서는 Address옆의 화살표를 선택한다.

 

 

 

그럼 위와 같이 자세한 Retain Count의 기록이 출력되는데 처음 Recode reference count를 선택하지 않았다면 위 화면과 같이 자세한 retain Count기록이 출력되지 않을 것이다.

이 방법을 사용하여 번번히 retain count를 찍는 수고를 덜게 될것이고 메모리 관리가 한결 수월해 졌다고 생각한다.

 

+ Recent posts