본문 바로가기

Program/iOS

iOS5 ARC를 써야하나...1

** 개인적 메모입니다. 태클 사절 **

이번에 진행한 프로젝트는 무료음악감상 앱이다. 젠장하라고 내가 회사에서 할당받은 테스트 기기는 iPod iOS 4.3.3..

업그레이드를 할래두 이놈의 iPod 을 제외한 나머지 기기들이 다 업그레이드 된 상태라 업그레이드를 하기도 애매하다..

Xcode4.2 / Base SDK iOS5.1/ Deployment Target iOS3.1


암튼, 앱 기능 중 오디오 재생을 백그라운드 모드에서 재생해야 하는 기능이 있다. 이 기능을 구현하다보니.. 

콜수신 시 자동으로 재생중인 오디오가 일시정지를 된다. 하지만 앱으로 복귀 시 다시 재생되지 않는다.


이부분을 처리하기 위해서 사용한 클래스가 


CTCallCenter 인데..요놈은 iOS 4.0 부터 사용 가능하다 그래서 Deployment Target를 4.0 으로 변경했다.

iOS 4.0 으로 올라오니 블럭 코딩을 해도 무방해지고.. 


그런데 CTCallCenter 이 좀 이상하다.. 


@A.m

-(id) init

{

self = [super init];


ctCallCenter = [[CTCallCenter allocinit];

ctCallCenter.callEventHandler....


return self;

}


@controller source  

....

A a = [A alloc] init]; <- 생성.

....


a 의 retainCount는 1이 아닌 2가 나온다..젠장.


CTCallCenter 를 멤버로 가지고있는 객체 A를 생성하고 초기화 메소드 내에서 CTCallCenter를 생성하면 상위(?)객체의 retainCount를 +1해버린다. 

아무래도 CTCallCenter 내부적으로 CTCallCenter를 생성시키는 객체를 retain 참조하는 것 같다.


그리고  A의 dealloc 메소드에서 ctCallCenter를 release 해주는데..


A를 사용하는 controller 에서 A를 release 해도 A의 dealloc가 호출되지 않는다..

ctCallCenter 를 생성하면서 retainCount가 1증가 한 상태라 메모리 해제가 되지 않게 되었다..


ARC 가 있는 상황에서 retain / release / autorelease 를 개발자가 직접 처리하다 보니 이것 저것 짜증이 좀 난다.


ARC 를 좀 정리해야 것다.