Transcript 예외처리
예외처리
NSException 클래스가 처리
NSException의 멤버
name
reason
callStackReturnAddresses
자주 보이는 NSException의 하위 클래스
NSRangeException
NSInvalidArgumentException
NSInternalInconsistencyException
Objective-C의 예외처리를 위한 예약어
@try: Exception이 던져질 수 있는 block을 정의합니다.
@throw: Exception object를 던집니다.
@catch(): @try block안에서 던져진 exception을 catch합니다.
@finally: @try block에서 Exception이 던져지던 아니던 수행되어질
block code를 정의합니다.
예외처리 예제(Command Line)
#import <Foundation/Foundation.h>
@interface Test : NSObject
@end
@implementation Test
@end
int main (int argc, char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Test *Obj = [[Test alloc] init];
@try
{
//이런 메서드가 없음
//예외가 발생되고 처리를 catch에 넘김
[Obj Test];
}
}
@catch (NSException *exception)
{
NSLog (@"예외처리 구문 수행");
NSLog (@"예외 이름: %@",exception.name);
NSLog (@"예외 이유: %@",exception.reason);
}
@finally
{
NSLog (@"무조건 수행하는 구문");
[Obj release];
[pool drain];
}
return 0;
NSAssert
특정 조건을 만족하지 않는 경우 NSInternalInconsistencyException예외를 발생
시켜 프로그램을 강제로 중단시키는 매크로함수
사용방법
NSAssert(만족해야 하는 조건, 출력할 문장);
예제
#import <Foundation/Foundation.h>
@interface Test : NSObject
-(void)disp;
@end
@implementation Test
-(void)disp
{
int n = 15;
NSAssert(((n < 10) && (n >= 0)), @"프로그램 중단");
NSLog(@"정상 수행");
}
@end
int main ()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Test *Obj = [[Test alloc]init];
@try
{
[Obj disp];
}
@catch (NSException *exception)
{
NSLog (@"예외처리 구문 수행");
NSLog (@"예외 이름: %@",exception.name);
NSLog (@"예외 이유: %@",exception.reason);
}
[pool drain];
return 0;
}
에러 처리
1. 에러 처리
에러가 발생하면 메서드나 함수의 리턴 값 형태로 에러의 발생을 리턴합니다.
파일 처리에는 이러한 에러 처리를 위한 객체를 대입하도록 되어 있습니다.
이 경우 에러 처리에 관련된 오브젝트를 대입하면 에러가 발생해도 프로그램이
중단되지 않고 적절한 메시지를 출력하도록 프로그램을 만들 수 있습니다.
2. NSError
에러에 대한 정보를 저장할 수 있는 클래스
생성자
+(id)errorWithDomain:(NSString *)domain code:(NSInteger)code
userInfo:(NSDictionary *)dic
멤버 프로퍼티
(NSString *)domain: 에러와 관련된 기술 요소 (Cocoa, Unix…)
(NSInteger)code: 에러에 관련된 정수 값
(NSDictionary *)userInfo: 에러에 관련된 정보를 저장할 사전
멤버 메서드
(NSString *)localizedDescription: 에러를 설명하는 문자열로 domain과 code 출력
(NSString *)localizedFailureReason: 에러의 발생 원인
(NSString *)localizedRecoverySuggestion: 에러의 대처 방법
예제
#import <Foundation/Foundation.h>
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSError *error = nil;
NSStringEncoding enc = NSASCIIStringEncoding ;
NSString *contents;
contents = [NSString stringWithContentsOfFile:@"hello.txt" usedEncoding:&enc error: &error];
if(error != nil)
{
NSLog(@"%i", [error code]);
NSLog(@"%@", [error domain]);
NSLog(@"%@", [error localizedDescription]);
}
else
NSLog(@"파일 내용: %@", contents);
[pool drain];
return 0;
}
X-Code 화면 설정
[X-Code] – [Preference] 메뉴를 이용합니다.
[All – In – One]: 빌드, 디버깅, 검색 등이 모두 하나의 창에서 실행
[Condensed]: 파일 창, 편집 창, 디버깅 창 등이 모두 분리되어서 실행
[Default]: 그룹 및 파일 창, 편집 창 등은 통합되어 있고 디버깅 창, GDB 콘솔 등
의 일부 창은 분리된 상태에서 실행
Break Point
Break Point 설정
원하는 지점을 선택하고 마우스 오른쪽을 클릭해서 Add BreakPoint
Break Point 삭제
Break Point를 선택하고 마우스 오른쪽을 클릭해서 remove BreakPoint
Break Point 까지 실행 후 옵션
Continue: 코드를 계속 실행
Step Over: 코드 다음 행으로 이동
Step Into - 코드가 다른 메서드를 호출하는 경우 메서드 안으로 진입
Step Out - 현재 메서드를 빠져 나가서 호출하는 메서드로 이동
Break Point에 동작 지정하기
Break Point에서 오른쪽의 + 버튼을 눌러서 동작 지정 가능
[Log]: 콘솔에 로그를 남기기
[Sound]: 시스템에 내장된 소리를 재생
[Shell Command]: 셀 명령 실행
[Debugger Command]: GDB 명령을 남김
Debugger
메뉴의 Run – Debugger 나 단축키 Shift + Command + y를 이용해서 화면에
출력할 수 있습니다.
화면 구성은 3개 영역으로 만들어져 있습니다.
Stack Trace, Variable List, Debugger Editing
메뉴
> Build and Debug:빌드를 하고 성공하면 디버그를 실행합니다.
> Terminate
디버깅시 나타나며 클릭하면 실행과 디버깅을 종료합니다.
> Fix
디버깅 실행 중에 소스 수정이 필요할 경우에는 소스를 수정하고 Fix를 실행하면, 종료/재시작 없이
계속 디버깅을 진행할 수 있습니다.
> Restart
Terminate와 Debug 명령을 동시에 실행하여, 종료 후 바로 디버깅을 재시작합니다.
> Pause:실행을 잠시 멈춥니다.
> Continue:실행이 중지되어 있을 때, 다음 브레이크포인트를 만나기 전이나 오류발생, 종료 전까지
계속 실행합니다.
> Step Over:함수를 만나도 함수 내부로 이동해서 디버깅을 하지 않고, 다음 라인을 실행합니다.
> Step Into:함수를 만날 경우 함수내부로 진입하여 디버깅을 진행합니다.
> Step Out:현재 함수의 수행을 완료하고 호출된 지점으로 돌아 갑니다.
> Breakpoints:
현재 라인에 브레이크포인트를 추가 또는 제거 합니다.
브레이크포인트는 디버깅 진행시 사용자가 확인을 위하여 어플리케이션 실행이 잠시 중지되는 위치
입니다.
> Console:gdb를 직접 사용할 수 있게 해줍니다.
예제
1. 소스 파일에 임의의 Break Point설정
2. Break Point에 아래처럼 설정
[Log]: 브레이크 포인트
[Sound]: Basso
[Shell Command]: ls -al
[Debugger Command]: print (const char *)args[0]
[Apple script]: display dialog "Welcome to AppleScript."
Watch Point
변수의 값이 변경되는 경우를 감시하고자 하는 경우에 사용하는 기능
이 포인트를 설정해두면 변수의 값이 변경되면 실행이 자동적으로 멈추게 됩니
다.
디버거 창의 Variable 항목에서 선택할 수 있으며 변수를 선택하고 마우스 오른쪽
메뉴를 눌러서 Watch Variable를 선택해서 선택하면 됩니다.
예제
1. View Based Application 프로젝트 생성(DebugTest)
2. DebugTestViewController.m 파일에 viewDidLoad 메서드 재정의
- (void)viewDidLoad
{
[super viewDidLoad];
[self method1];
[self method2];
}
3. DebugTestViewController.m 파일에 2개의 메서드 구현
-(void)method1
{
NSLog(@"첫번째 메서드");
}
-(void)method2
{
NSLog(@"두번째 메서드");
}
4. DebugTestViewController.m 파일의 int j 부분에 break Point를 설정한 디버거에서 실행해서 step
Over와 Step Into를 비교
Symbolic Break Point
Symbolic Break Point: [Run] – [Show] – [Break Point]에서 직접 메서드의 이름
을 지정하는 것이 가능합니다.
Break Point에 condition을 설정해서 특정 조건을 만나면 수행을 종료하는 것도
가능합니다.
정적 분석
Build 메뉴의 Build and Analyze를 이용하면 정적 분석을 할 수 있습니다.
정적 분석이란 논리적인 오류도 일정 부분 검색을 할 수 있습니다.
변수를 생성하고 사용하지 않는다던지 메모리 할당을 하고 해제를 하지 않은
경우 들을 찾아 낼 수 있습니다.
Instruments
실행 중인 프로그램의 동작 상태를 감시하고 분석하는 데 사용되는 프로그램
작업의 종류(시뮬레이터에서 가능 - 나머지는 디바이스에서만 가능)
1. Leaks: 메모리 누수 감지
2. Object Allocations - 객체의 생성과 해제를 감시
3. CPU Sampler – CPU 사용량 확인
4. Activity Monitor: 시스템 자원을 사용하는 상황을 감시 - 모든 프로그램 검사
실습(Leaks)
1. View Based Application 생성(Leaks)
2. LeaksViewController.h 파일에 변수 및 IBAction 메서드 선언
#import <UIKit/UIKit.h>
@interface LeaksViewController : UIViewController {
NSArray * ar;
}
-(IBAction)click;
@end
3. LeaksViewController.m 파일에 IBAction 메서드 구현
-(IBAction)click
{
ar = [[NSArray alloc] initWithObjects:@"Alloc", nil];
}
4. LeaksViewController.xib 파일의 view에 버튼을 1개 추가하고 IBAction 메서드 연결
5. [Run] – [Start with Performance Tool] – [Leaks]
실행 시킨 후 적색이 나타나면 메모리 leak이 발생한 것이므로 콜 스택을 확인