Tag Archives: iPod

[iPhone] NSLog 업그레이드 + Debug 모드에서만 로깅하기

iPhone 개발환경을 보면 Visual Studio, Eclipse와 같은 화려한 IDE의 지원을 받아오던 저로서는 답답하고 답답하고 안타깝기에 그지없는 상황이 자주 연출되곤 합니다.

가끔씩 gdb에 근거한 알수없는 로깅시스템도 한몫을 하는데요 우리의 허접하기 짝이없는 NSLog를 화려하게 업그레이드 시키는 방법을 알아보도록 할까요.

우선 목표는 NSLog의 내용을 파일명과 에러발생 지점 라인, 기타 정보를 포함함과 동시에 빌드시에 선택하는 ActiveConfiguration을 Debug로 선택했을때만 로깅하도록 해보겠습니다.

사용자 삽입 이미지그림을 하나 보도록 하겠습니다. 이것과 같은 순서로 OTHER_CFLAGS를 추가하면 됩니다.
(1) 자신의 프로젝트 루트를 선택합니다.
(2) Info버튼을 눌러 Build 탭으로 이동합니다.
(3) Debug를 선택합니다.
(4) Show에서는 Setting defined this level을 선택해 줍니다.
(5) 그림에는 안나왔는데 좌측 하단의 Add User-defined setting을 눌러 OTHER_CFLAGS = -DDEBUG=1 을 추가해 줍니다.

이제 Debug모드로 컴파일할때는 #define DEBUG 1 이 자동으로 설정되게 됩니다.

이제 각각의 프로젝트의 prefix를 열어봅시다. 보통은 프로젝트명_Prefix.pch 이름을 가지고 있습니다.
다음을 추가해 주도록 합시다.

#ifdef DEBUG
    #define NSLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
    #define NSLog( s, ... )
#endif

이제는 Debug모드일때만 이쁘게 로깅을 하며, 그외의 경우에는 NSLog가 아예 동작하지 않게 됩니다. 한결 좋아졌네요.

참고 :
http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog
http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code

[iPhone] UINavigationController 정리

UINavigationController를 사용할때 쓸만한 내용을 발견하여 정리해 봅니다.

1. 초기화
UINavigationController의 초기화를 위해서는 보통 가장 루트가 되는 뷰컨트롤러를 지정하게 됩니다.

[code]UIViewController *viewController = [[UIViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
[/code]

2. 새로운 뷰로 이동하기/빠져 나오기
새로운뷰로 이동하는것은 다음과 이해하시면 좋을것 같습니다. 네비게이션컨트롤러는 기본적으로 스택(Stack)과 같은 구조로 동작을 하며, 눈에 보이는 뷰는 항상 가장 마지막에 삽입된 객체(뷰)가 됩니다.

그래서인지, 뷰를 삽입하고 빼는 메서드들의 이름이 push/pop으로 시작을 하는군요.

[code]// 새로운 뷰 삽입하기
[navController pushViewController:newViewController animated:YES];
 
// 뷰컨트롤러 안에서 – 자기 자신을 네비게이션 컨트롤러에서 제거
[self.navigationController popViewControllerAnimated:YES];
 
// 어디서든지 네비게이션 컨트롤러에 접근 가능할 때
[navController popViewControllerAnimated:YES];[/code]

3. 최상위 뷰로 한번에 이동하기
여러개의 뷰를 통해서 들어가 있는 상태라면 다음과 같은 방법으로 한번에 최상위로 빠져나갈 수 있습니다.

[code][self.navigationController popToRootViewControllerAnimated:YES];[/code]

4. 모달(Modal)뷰 형식으로 띄우기
네비게이션 컨트롤러를 사용하긴 하지만 페이징의 느낌이 들지 않게 별개의 페이지처럼 띄우고 싶을 경우가 있습니다. 다음의 메서드를 사용하여 상단의 네비게이션바조차 나오지 않는 풀스크린의 뷰를 띄울 수 있습니다.

[code]// 모달 뷰 띄우기
[self.navigationController presentModalViewController:modelViewController animated:YES];
 
// 모달 뷰 제거 – 모달 뷰 컨트롤러 내부에서
[self dismissModalViewControllerAnimated:YES];[/code]

참고 : http://qstufie.com/blog/bb/2008/10/uinavigationcontroller-how-to/