아이폰 프로그래밍을 하면서 고생했던 부분에 대해 기록을 남기기로했다.
연습삼아 짜고 있는 구구단게임 프로그램에서 시간을 재야하는 일이 생겼다. 50문제를 얼마나 빨리 푸느냐를 가지고 게임을 하는것인데, 첫번째 문제가 나오고 그 후 50번째 문제를 풀때까지의 시간을 재는 것이다.
인터넷을 뒤져보니 NSDate라는걸 써서 시간을 처리한다고 들 한다.
첫문제 낼때
NSDate *startTime = [NSDate date];
을 해서 시간을 기록 해주고, 50번째 문제를 풀고나면 또 한번 해서 기록한 후에 두 시간의 차이를 구한다.
NSDate *finishTime = [NSDate date];
NSTimeInterval recordTime = [finishTime timeIntervalSinceDate:startTime];
인터넷에서 내가 찾은 페이지엔 간단하게 이렇게만 나온다. 그러나 결과는 에러이거나 말없이 꺼지거나다. 오브젝티브씨는 참 과묵한 컴퍼일러라고나 할까? 왠만하면 말없이 죽어버린다. 디버깅하다가 끝무렵에 가면 대부분 말이 없이 그냥 죽는다. 여자들 같다고나 할까? 말 안해도 알아차려라 뭐 그런 말인가본데.. 말을 안하면 어떻게 아냐고요?
그래서 며칠 고생했다. 그러다가 '아는분' 에게 물어봤더니 대뜸 짐작가는곳이 있다고 한다.
retain을 해줘야 한다는 것이다. 안그러면 처음 시간 기록한 변수의 값이 날아가 버린다는 것이다. 시간을 저장한 인스턴스는 그 유지시간이 얼마 되지 않아서 빨리 써주지 않으면 값이 날아가 버린다는 이야기를 한다. 내 생각에는, 변수가 시간 지난다고 값을 날려버리는건 상상도 못한일이었는데, 이제와 가만히 보니 이건 그냥 변수가 아니라 NSDate 오브젝트의 인스턴스였던 것이다. 내가 그 차이를 인지하고 있었다고 한들, 시간이 지나면 인스턴스의 값이 날아가는건 상상이나 했겠는가? 역시 모르긴 마찬가지였을 것이다.
아무튼 첫 번째 시간기록 후에는 retain을 해줘서 저장한 시간 값이 날아가지 않도록 잡아줘야 한다.
NSDate *startTime = [NSDate date];
[startTime retain];
이걸 알려준 분의 말에 의하면 이런걸 막으려고 retain을 좀 과하게 한다고 한다. 왠만하면 일단 다 retain한다고 하는데 난 이제 처음 해봤는데? 내가 지금까지 굉장히 고요한 바다에서 항해해오지 않았나 하는 생각이 들면서 앞날이 불안불안 --;;
참고로 recordTime은 두배길이짜리 실수(Double float)니까 써먹을때도 실수로써 써줘야 한다.
time.text = [NSString stringWithFormat:@"%1.2f",recordTime];
stringWithFormat에서 1.2f는 소수점아래 두자리까지 표시하는 실수형을 뜻한다. 요거두 모를땐 매우 갑갑한거였는데 --;;
Objective-C는 모든걸 오브젝트로 해결한다는 점이 일반 C와 큰 차이점이 되겠다. 가끔 int 같은거 써서 일반변수 선언을 해서 쓰기도 하지만 예제코드에서 그런거 볼때마다 반가울 정도로 NS라는 이름표를 달고 있는 낯선이들이 대부분이다. 나름대로는 Next Step의 정기를 이어받아 지은 이름들이라지만, 초보들에겐 힘든 존재들이다 --;;