다소 과하게 retain하라

iphone programming 2010.05.21 08:37
아이폰 프로그래밍을 하면서 고생했던 부분에 대해 기록을 남기기로했다.

연습삼아 짜고 있는 구구단게임 프로그램에서 시간을 재야하는 일이 생겼다. 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의 정기를 이어받아 지은 이름들이라지만, 초보들에겐 힘든 존재들이다 --;;




저작자 표시 동일 조건 변경 허락
신고

'iphone programming' 카테고리의 다른 글

다소 과하게 retain하라  (6) 2010.05.21
Trackback 0 : Comments 6
  1. 꼬치 2010.05.21 15:27 신고 Modify/Delete Reply

    과하게 못알아듣는 1인.

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.05.21 18:49 신고 Modify/Delete

      하 하 이 글은 '꼬치구이용'은 아닌듯 하옵니다. 알아듣고 못듣고를 떠나서 항상 무플을 방지해주시는 꼬치님께 감사드립니다 ^^

  2. KiBe 2010.06.09 18:22 신고 Modify/Delete Reply

    우연히 검색으로 들어왔습니다. 밤중에 등에 물린 모기자국을 벅벅 긁는듯한 시원함이 밀려오네요.
    좋은 글 고맙습니다. 많이 도움이 되었습니다.

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.06.11 03:16 신고 Modify/Delete

      되움이 되었다니 정말 기쁩니다 ^^ 저는 이문제 때문에 며칠을 고생했었는데, 이 글 때문에 빨리 해결되신거라면 더 좋겠네요 ㅎㅎ

  3. letsme 2010.06.22 01:50 신고 Modify/Delete Reply

    안녕하세요. 이두환입니다. :-)
    alloc 이외의 메소드를 이용하여 생성하는 인스턴스는 대부분 Autorelese pool 을 이용한다고 생각하시면 됩니다.
    이런 메소드를 convenient method 라고 부르는데요, Autorelease pool 의 동작 방식만 알고 계시면 언제 retain 을 하고 release를 해줘야 할지 헷갈리지 않고 불안해하실 일도 없으실 거 같네요.
    쓰고 보니 이미 알고 계신 내용일지도 모르겠습니다.

    • Favicon of http://blog.whattomake.co.kr BlogIcon MrKiss 2010.06.22 17:27 신고 Modify/Delete

      오~ 두환님 들러주셨군요 ^^ 말씀대로 Autorelease pool의 동작방식을 아직 잘 몰라서요--; 어디 좀 정리되어 있는 곳 있으면 추천 바랍니다

Write a comment

티스토리 툴바