Development
글수 82
원본은 구글 독스에서 틈틈히 업데이트 하겠습니다.
http://bit.ly/9kKtN6
답글로 의견 주시면 원본에 반영하겠습니다.
----------
아이폰 어플 개발기
난이도로 보면 쉬운 내용이지만 개발 경험담을 공유해보기 위해서 정리했습니다.
잘못된 부분이나 개선해야 하는 부분들 코멘트 해주시면 뼈가되고 살이되는 양분으로 활용하겠습니다.
적어도 일주일에 한번씩 업데이트 할 계획입니다. (늦어지면 채찍질도 부탁드립니다. ^^;)
개발 공부에 많은 도움을 받고 있는 네이버 맥부기 카페와 KIDG 두곳에 올릴 계획입니다.
올리지 말라고 하시면 안올리겠습니다. ^^
현재 예상중인 목차입니다.
1. Animate Image by UIImageView
2. Touch Event Handling
3. Play Sound & Music
4. Multi View Handling
5. Play Intro Movie
6. Game Logic (include RadomizeShuffleQueue)
일 단 시작해봅니다.
1. Animate Image by UIImageView
프로젝트 생성하고 하는 부분도 화면 캡쳐하면서 설명해야하지만 일단 좀 미뤄보겠습니다.
처음에 여러개의 이미지들을 순서대로 애니메이션 해주는 기능이 필요했습니다.
그래서 찾은 소스가 아래와 같습니다.
(후반부에 이 코드 수정본이 있으니 갖다 쓰실때는 수정본을 쓰세요.
이 소스에는 문제점을 내포하고 있는 상태입니다.)
imageMain.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"Whistle_01.png"],
[UIImage imageNamed:@"Whistle_02.png"],
[UIImage imageNamed:@"Whistle_03.png"], nil];
imageMain.animationDuration = 0.1;
imageMain.animationRepeatCount = 0;
[imageMain startAnimating];
InterfaceBuilder 에서 UIImageView 하나를 화면에 배치하고
해당 이미지를 제어하기 위해 변수에 대입시켜줍니다.
(관련 내용은 일단 생략 ㅡㅡ;)
.h 파일쪽에는
UIImageView *imageMain;
로 변수 하나 선언해주고
@property (nonatomic, retain) IBOutlet UIImageView *imageMain;
로 아웃랫 설정도 해줍니다.
.m 에는
상단에
@synthesize imageMain;
도 추가하고
하단에 해제하는 부분도 넣어주고 시작합니다.
- (void)viewDidUnload {
imageMain = nil;
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[imageMain release];
[super dealloc];
}
그리고 메인 코드를 보겠습니다.
뭐 어느 순간에 플레이 할 것인지에 따라서 달라지겠지만
-(void)viewDidLoad
라고 일단 해보죠.
다 현재 뷰가 로드되면 실행됩니다.
시작~
-(void)viewDidLoad
{
imageMain.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"Whistle_01.png"],
[UIImage imageNamed:@"Whistle_02.png"],
[UIImage imageNamed:@"Whistle_03.png"], nil];
imageMain.animationDuration = 0.1;
imageMain.animationRepeatCount = 0;
[imageMain startAnimating];
}
위 코드를 간단히 설명하자면
Whistle_01.png, Whistle_02.png, Whistle_03.png 이렇게 3개의 이미지 파일이
0.1초안에
플레이 되는 것이 무한반복됩니다.
3/0.1s
위 코드를 자신의 상황에 맞게 수정하시면 됩니다.
예를 들어 15개 이미지를 1초동안 플레이하는데 딱 한번만 애니메이팅하겠다하면
3개 이미지 배열을 15개 입력하시고
imageMain.animationDuration = 1;
imageMain.animationRepeatCount = 1;
로 수정하면 됩니다.
참 쉽죠잉~
이렇게 구현하면 기능은 잘 됩니다.
근데 나중에 개발 완료할때쯤 스트레스 테스트를 해보게 되면 예상치 않았던 문제가 생깁니다.
문제 생기고 나서 수정하게 되었죠. ㅡㅡ;
일단 위 코드는 간결하긴 하지만 imageNamed 라는 메소드에 중요한 작업을 맡기고 있습니다.
이미지 파일을 읽어와서 메모리 할당하고 해제하는 기능을 말이죠.
imageNamed 를 쓰면 알아서 해결해준다고 해서 편하게 썼는데 그게 아니더군요.
예를 들어 위 코드를 해당 이미지가 클릭된 순간 한번씩 불러준다고 하면
처음에는 잘 되지만 수십번 눌러대다보면 어느순간 이상한 현상이 발생하다가 어플이 훅 죽어버립니다.
아 뭔가 말이 길었는데...결론부터 말씀드리면 메모리 할당 해제를 알아서 잘 해줄것 같아서 맡겼더니
그렇게 잘 처리 안해준다는 얘기지요.
결국 메모리 할당 해제를 직접 해줘야 합니다.
그 래서 적용한 결과물이 아래와 같습니다.
정리된 코드
-----
UIImage *ani01 = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Whistle_01" ofType:@"png"]];
UIImage *ani02 = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Whistle_02" ofType:@"png"]];
UIImage *ani03 = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Whistle_03" ofType:@"png"]];
imageMain.animationImages = [NSArray arrayWithObjects:ani01, ani02, ani03, nil];
imageMain.animationDuration = 0.1;
imageMain.animationRepeatCount = 0;
[imageMain startAnimating];
[ani01 release];
[ani02 release];
[ani03 release];
-----
아 뭔가 끔찍해졌습니다. imageNamed 메소드를 이용해 깔끔하던, 그리고 대괄호([,])를 사용하던 멋진 코드가 먼가 이상해졌습니다.
하지만 어쩔수 없네요.
이렇게 해야 메모리 문제없이 정상적으로 동작합니다.
프로그램 개발하고 앱스토어에 올리려고 막판 테스트 하는 중간에 문제점을 발견해서 막판 대수정을 가하게 되었습니다.
아 끔찍해라..
어처구니 없이 급하게 써내려간 글이지만 조금이라도 도움이 되셨길 바랍니다.
감사합니다.

이 블로그에서는 2.X 버전에서만 메모리 릭이 일어난다고 되어있네요.
2.X버전이신가요?