아이폰어플개발정보2012. 1. 26. 11:03
http://www.cocos2d-iphone.org/forum/topic/8424
애드몹을 사용 하시기 위해서는 위의 사이트에서 등록 하여 고유 넘버 키를 받으셔야 사용이가능 합니다.
참고 사이트 입니다.


=============================================================================
AdViewController.h
#import <UIKit/UIKit.h>
#import <iAd/iAd.h>
#import "AdMobDelegateProtocol.h"

@protocol AdViewControllerDelegate;

@interface AdViewController : UIViewController <ADBannerViewDelegate, AdMobDelegate>
{
 id <AdViewControllerDelegate> delegate;
 id adBannerView;

 AdMobView* adMobAd;
}

@property (nonatomic, assign) id <AdViewControllerDelegate> delegate;

- (id)initWithMasterView:(UIView*)masterView;
- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation;

@end

@protocol AdViewControllerDelegate

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;

@end

AdViewController.m

#import "AdViewController.h"
#import "cocos2d.h"

#import "AdMobView.h"

@implementation AdViewController

@synthesize delegate;

- (UIDeviceOrientation)currentOrientation
{
 return [[CCDirector sharedDirector] deviceOrientation];
}

- (id) initWithMasterView:(UIView*) masterView
{
 if( nil != (self = [super init]) )
 {
  [self setView:masterView];

  //Initialize the class manually to make it compatible with iOS < 4.0
  Class classAdBannerView = NSClassFromString(@"ADBannerView");
  if (classAdBannerView != nil)
  {
   adBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
   [adBannerView setDelegate:self];
   [adBannerView setRequiredContentSizeIdentifiers: [NSSet setWithObjects:
                 ADBannerContentSizeIdentifier320x50,
                 ADBannerContentSizeIdentifier480x32, nil]];

   [self.view addSubview:adBannerView];

   [self rotateBannerView:[self currentOrientation]];

   [adBannerView setHidden:YES];

  }
  else
  {
   //Request an AdMob Ad
   adMobAd = [AdMobView requestAdOfSize:ADMOB_SIZE_320x48 withDelegate:self];
   [adMobAd retain];
  }
 }

 return self;
}

- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation
{
 if (adBannerView)
 {
  if (UIDeviceOrientationIsLandscape(toDeviceOrientation))
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier480x32];
  else
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];

  [(UIView*)adBannerView setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [(UIView*)adBannerView setCenter:CGPointMake(160, 455)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adBannerView setCenter:CGPointMake(160, 25)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adBannerView setCenter:CGPointMake(16, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adBannerView setCenter:CGPointMake(304, 240)];
   }
    break;
   default:
    break;
  }
 }

 if (adMobAd)
 {
  [adMobAd setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [adMobAd setCenter:CGPointMake(160, 456)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adMobAd setCenter:CGPointMake(160, 24)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adMobAd setCenter:CGPointMake(24, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adMobAd setCenter:CGPointMake(296, 240)];
   }
    break;
   default:
    break;
  }
 }
}

#pragma mark -
#pragma mark ADBannerViewDelegate

- (BOOL)allowActionToRun
{
 return YES;
}

- (void) stopActionsForAd
{
 //Pause background music here

 [adBannerView setHidden:YES];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] pause];
}

- (void) startActionsForAd
{
 //Resume background music here

 [self rotateBannerView:[self currentOrientation]];
 [[UIApplication sharedApplication] setStatusBarOrientation:(UIInterfaceOrientation)[self currentOrientation]];
 [adBannerView setHidden:NO];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] resume];
 [[CCDirector sharedDirector] startAnimation];
}

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
 BOOL shouldExecuteAction = [self allowActionToRun];
    if (!willLeave && shouldExecuteAction)
    {
  [self stopActionsForAd];
    }
    return shouldExecuteAction;
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
 [adBannerView setHidden:NO];
 [delegate adController:self didLoadiAd:banner];
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
 [adBannerView setHidden:YES];
 [delegate adController:self didFailedToRecieveiAd:banner];
}

- (void)bannerViewActionDidFinish:(ADBannerView *)banner
{
 [self startActionsForAd];
}

#pragma mark -
#pragma mark AdMobDelegate methods

- (NSString *)publisherIdForAd:(AdMobView *)adView
{
 return @"your_admob_publisher_id";    //replace it with you publisher id
}

- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView {
 return self;
}

- (UIColor *)adBackgroundColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)primaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)secondaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (NSArray *)testDevices
{
 return [NSArray arrayWithObjects: ADMOB_SIMULATOR_ID, nil];
}

- (void)didReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did receive ad");

 [self rotateBannerView:[self currentOrientation]];
 [self.view addSubview:adMobAd];

 [delegate adController:self didLoadAdMobAd:adView];
}

// Sent when an ad request failed to load an ad
- (void)didFailToReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did fail to receive ad");
 [adMobAd removeFromSuperview];
 [adMobAd release];
 adMobAd = nil;

 [delegate adController:self didFailedToRecieveAdMobAd:adView];
}

#pragma mark -
#pragma mark Memory Management

- (void) dealloc
{
 if (adMobAd)
 {
  [adMobAd setDelegate:nil];
  [adMobAd removeFromSuperview];
  [adMobAd release];
  adMobAd = nil;
 }

 if (adBannerView)
 {
  [adBannerView setDelegate:nil];
  [adBannerView removeFromSuperview];
  [adBannerView release];
  adBannerView = nil;
 }

    [super dealloc];
}

@end

The usage is very simple, #importAdViewController.h in you Layer's .h and add the delegate protocol AdViewControllerDelegate

#import "AdViewController.h"

@interface Menu : CCLayer <AdViewControllerDelegate>
{
 AdViewController *adController;
}

And in your layer's .m add this

- (void)onEnter
{
 [super onEnter];

 adController = [[AdViewController alloc] initWithMasterView:[[CCDirector sharedDirector] openGLView]];
 [adController setDelegate:self];

}

- (void)onExit
{
 //Completely remove the controller
 [adController setDelegate:nil];
 [adController release];
 adController = nil;

 [super onExit];
}

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;
{
 //Do something when the ad fails to load, like moving objects.;
}

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad fails to load, like moving objects.
}
<script src="http://gods2000.tistory.com/plugin/CallBack_bootstrapper?&src=https://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&id=29&callbackId=gods2000tistorycom292340&destDocId=callbacknestgods2000tistorycom292340&host=http://gods2000.tistory.com&float=left&random=631"></script> 출처 :http://gods2000.tistory.com/29
Posted by 오늘마감

댓글을 달아 주세요

XCODE2011. 4. 9. 11:08

Xcode 로 파일을 생성하면 소스 코드 상단의 주석에 __MyCompanyName__ 가 계속 보인다. 이를 수정하는 방법은 다음과 같다.


* 터미널을 실행한다.

* 아래의 명령을 실행한다.


# defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions -dict ORGANIZATIONNAME "Company Name"


맥북을 사고 처음으로 쓰는 포스트군요. ^^



출처 : http://blog.naver.com/PostView.nhn?blogId=websearch&logNo=70096929676
Posted by 오늘마감

댓글을 달아 주세요

옵션에 보면 디버깅 항목에 체크 되어 있는 부분을 없애 주어야 합니다.

Preferences->Debugging->Load symbols Lazily 체크 옵션


심볼을 로드 하기 전에 브레이크가 걸렸을 때 처리를 하지 않는 옵션인데

프로젝트가 좀 커지게 되면 흔히 발생하는 문제중에 하나입니다.



출처 : http://blog.naver.com/PostView.nhn?blogId=darkcdp&logNo=20117160870
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:21
iPhone Tutorial - nib 에서 불러온 뷰를 특정위치에 모달로 띄우는 방법
- (void)showmodal:(UIView*)pParentView {

    UIView* modalView = [self view];
    
    CGPoint middleCenter = modalView.center;
    CGSize offSize = [UIScreen mainScreen].bounds.size;
    CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, -300);
    
    modalView.center = offScreenCenter; // we start off-screen
    [pParentView addSubview:modalView];
    
    // Show it with a transition effect
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.9]; // animation duration in seconds
    modalView.center = middleCenter;
    [UIView commitAnimations];
}

- (IBAction)hideModal
{    
    CGSize offSize = [UIScreen mainScreen].bounds.size;
    CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, -300);
    [UIView beginAnimations:nil context:[self view]];
    [UIView setAnimationDuration:0.9];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(hideModalEnded:finished:context:)];
    [self view].center = offScreenCenter;
    [UIView commitAnimations];
}
                                          
- (void) hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{    
    UIView* modalView = (UIView *)context;
    [modalView release];



출처 : http://blog.naver.com/PostView.nhn?blogId=suny4rang&logNo=50084523871
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 21. 09:29
[펌] Cocoa 에서 MySQL 라이브러리 사용하기
출처 - http://www.cocoadev.co.kr/56



코아에서 MySQL C Library를 이용하는 예입니다. wrapper 클래스를 작성하여 MySQL
서버에 접속해서 데이터를 가져오는 간단한 샘플 코드를 작성해 보겠습니다.

OS X에서 MySQL 설치 및 설정은 이전 포스트를 참고해 하세요.


1. MySQL에서 작업

1) MySQL 서버 확인
테스트를 위하여 테이블을 생성하고 데이터를 넣어 보겠습니다. 우선 시스템 환경설정의 MySQL 항목에서 아래와 같이 서버가 기동중인지 확인 합니다. 서버가 실행되지 않고 있으면 Start 버튼을 클릭하여 아래와 같이 실행 상태로 만듭니다.

2) 테이블 생성 및 데이터 입력
그 다음 아래와 같이 터미널에서  MySQL에 로그인 후에 member 테이블을 생성하고 데이터를 넣습니다. 저는 이전에 test/1111로 계정을 만들고 cocoadev란 데이터베이스를 만들어 두었기에 아래와 같이 접속하였습니다.

id, name 두개의 필드를 가진 member란 테이블을 생성하고, 테스트를 위해 1, cocoa 값으로 데이터를 입력합니다.

2. 소스코드 작성
Xcode 를 실행하고 프로젝트를 생성합니다. 저는 최대한 간단하게 만들기 위해 프로젝트 타입을 Command Line Utility의 Foundation Tool로 선택하고 프로젝트를 생성하였습니다.

Wrapper 클래스 작성을 위하여 새 파일에서 Objective C class 타입으로 MySqlDB 클랙스를 생성합니다. 이제 MySqlDB.h 파일과 MySqlDB.m 파일을 작성합니다.

테스트를 위하여 연결 및 쿼리등 필요한 메소드만 작성해 보겠습니다. mysql.h 파일을 참고 하시면 MySQL 라이브러리에서 제공하는 많은 함수들을 확인하실 수 있습니다.

1) MySqlDB.h 편집
#import <Cocoa/Cocoa.h>
#import "mysql.h"

@interface MySqlDB : NSObject {

    bool isConnected;
    int rowCount;
   
    MYSQL mySQL;
    MYSQL *pMySQL;
   
    MYSQL_RES* pRes;
    MYSQL_ROW Rows;
}

-(id) initWithServer: (const char*) host
             loginID: (const char*) userid
         loginPasswd: (const char*) passwd
               setDB: (const char*) database;

-(bool) connect : (const char*) host
         loginID: (const char*) userid
     loginPasswd: (const char*) passwd
           setDB: (const char*) database;

-(bool) query :(const char*) str;
-(bool) getRows;
-(bool) getStringData: (int)idx toBuffer: (char *) buff;

-(bool) isConnected;
-(int) rowCount;

@end

2) MySqlDB.m 파일 편집
#import "MySqlDB.h"


@implementation MySqlDB

-(id) initWithServer: (const char*) host
             loginID: (const char*) userid
         loginPasswd: (const char*) passwd
               setDB: (const char*) database
{   
    self = [super init];
   
    [self connect: host
          loginID: userid
      loginPasswd: passwd
            setDB: database];
               
    return self;
}

- (void)dealloc
{
    if(pMySQL)
        mysql_close(pMySQL);
   
    [super dealloc];
}

-(bool) connect : (const char*) host
         loginID: (const char*) userid
     loginPasswd: (const char*) passwd
           setDB: (const char*) database
{
    isConnected = FALSE;
   
    pMySQL = mysql_init(&mySQL);
    if(pMySQL == NULL)
    {
        return FALSE;
    }
   
    pMySQL = mysql_real_connect(&mySQL, host, userid, passwd, database, 0, 0, 0);
    if(pMySQL == NULL)
    {
        return FALSE;
    }
   
    isConnected = TRUE;
   
    return TRUE;
}

-(bool) query: (const char*) str
{
    if(!pMySQL)
        return FALSE;
   
    int ret = mysql_query(pMySQL, str);
    if(ret != 0)
    {
        return FALSE;
    }
   
    pRes = mysql_store_result(pMySQL);
    rowCount = mysql_num_rows(pRes);
   
    NSLog(@"rows:%d", rowCount);
    return TRUE;
}

-(bool) getStringData: (int)idx toBuffer: (char *) buff;
{
    if(Rows[idx] == NULL)
        return FALSE;
   
    strcpy(buff, Rows[idx]);
    return TRUE;
}

-(bool) getRows
{
    Rows = mysql_fetch_row(pRes);
   
    if(Rows == NULL)
        return FALSE;

    return TRUE;
}

-(bool) isConnected
{
    return isConnected;
}

-(int) rowCount
{
    return rowCount;
}

@end

3) MyTest.m 편집
이제 테스트를 위하여 위에 작성된 클래스를 사용하여 MySQL서버에 접속하여 데이터를 가져오도록  MyTest.m 파일에 소스를 추가해 보겠습니다. 연결시 로그인 정보와 데이터 베이스, 쿼리 내용은 자신의 환경에 맞게 변경해 줍니다.

#import <Foundation/Foundation.h>
#import "MySqlDB.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    MySqlDB* myDB = [[MySqlDB alloc] initWithServer:"localhost"
                                            loginID:"test"
                                        loginPasswd:"1111"
                                              setDB:"cocoadev"];
   
    if([myDB isConnected] == true)
    {
        if([myDB query :"SELECT * FROM member"])
        {
            char buff1[128];
            char buff2[128];
           
            [myDB getRows];
            [myDB getStringData: 0 toBuffer: buff1];
            [myDB getStringData: 1 toBuffer: buff2];
           
            NSLog(@"DATA: id=%s, name=%s", buff1, buff2);
        }
        else
            NSLog(@"Fail to query");
    }
    else
        NSLog(@"Fail to connect.");
   
    [myDB release]
    [pool release];
    return 0;
}


3. 빌드옵션 설정 및 라이브러리 등록

MySQL 라이브러리를 사용하기 위해서는 링크시에 라이브러리를 추가하도록 등록하고, 헤더파일을 인크루드하기 위해 위치를 지정해 주어야 합니다.

GCC 옵션에서 -I(인클루드 패스 지정), -L(라이브러리 패스 지정), -l(라이브러리 추가) 옵션을 생각하시면 됩니다.

1) include 패스 설정
빌 드시 헤더파일을 찾을 수 있도록 링크를 설정합니다. 프로젝트 정보창을 오픈합니다. Build 항목에서 "User Header Search Path"에 mysql의 include 패스를 입력합니다. 대부분 /usr/local/mysql에 설치되는데 다른 곳에 설치하신 분들은 그 곳의 패스를 입력합니다.

2. libmysqlclient.a 라이브러리 링크
파 인더에서 해당 디렉토리에 접근하기 힘들기 때문에 터미널에서
 > open /usr/local/mysql/lib 로 파인더를 오픈합니다.

libmysqlclient.a 파일을 드래그 하여 좌측과 같이 Xcode의 Frameworks 그룹으로 가지고 옵니다.




이제 모든 준비가 완료되었습니다. 빌드 후 실행하여 아래와 같은 결과를 확인합니다.

코 코아에서 MySQL 라이브러리를 사용하여 MySQL에 연결하는 방법을 간단히 알아 보았습니다. PostgreSQL이나 다른  C 라이브러리들도 위와 같은 방법으로 코코아에서 사용하실 수 있습니다.

티스토리 블로그 알리미를 작성한 적이 있는데, 설치형 블로그들은 위와 같이 DB에 직접 쿼리하는 방법으로 더욱 쉽고, 다용하고, 정확한 정보를 가져오는 툴을 작성할 수 있을 것 같습니다.


출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110085699082

'아이폰어플개발정보' 카테고리의 다른 글

[펌] NSURLConnection  (0) 2010.06.21
iPhone 사운드 관련 API  (0) 2010.06.21
[펌] Cocoa 에서 MySQL 라이브러리 사용하기  (0) 2010.06.21
[펌] NSXMLParser 로 RSS 읽어오기  (0) 2010.06.21
iPhone 개발 환경  (0) 2010.06.20
iPhone Software Stack  (0) 2010.06.20
Posted by 오늘마감

댓글을 달아 주세요

XCODE2010. 6. 21. 09:27
[펌] Xcode 에서 디버깅 작업
출처 - http://www.cocoadev.co.kr/73




Xcode에서 디버깅을 하는 방법에 대해서 알아 보겠습니다.

기본적인 내용만 간단히 알아 보는 것이므로, 보다 상세한 내용은 Xcode 메뉴얼이나 gdb 메뉴얼을 참고해 주세요.


1. 소스코드 편집

Xcode를 실행하고 New Project에서 Command Line Utility/Foundation Tool로 새로운 프로젝트를 생성합니다. 전 testDebug로 하였습니다. 소스파일 (testDebug.m)을 열고 아래와 같이 편집합니다.

#import <Foundation/Foundation.h>

int plusNum(int a, int b)
{
    int c;
    
    c = a + b;
    
    return c;
}

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    int i;
    char buff[10];
    
    for(i = 0; i < argc; i++)
    {
        NSLog(@"ARG: %d - %s", i+1, argv[i]);
    }
    
    NSLog(@"MY PATH: %s", getenv("MY_PATH"));
    
    for(i = 0; i < 10; i++)
    {
        buff[i] = '1' + i;
    }
    
    int a, b, c;
    a = 3;
    b= 5;
    
    c = plusNum(a, b);
       
    [pool release];
    return 0;
}


2. 실행인자, 환경변수 설정

빌드 후 실행하면 아래와 같이 ARG 값과 현경변수 MY_PATH의 값을 보실 수 있습니다. 실행 파일의 기본인자는 일반적으로 그 실행파일의 전체경로가 첫번째로 전달됩니다. (사용하시는 OS에 따라 간혹 다를 수 있습니다.) 임의의 MY_PATH 환경변수값은 설정되어 있지 않으므로 null로 출력되었습니다.


이제 디버깅 작업전에 프로그램 실행 시에 줄 수 있는 옵션들에 대해 간단히 알아 보겠습니다. Xcode 좌측의 Groups & Files에서 Executables항목에서 실행파일명을 더블클릭하여 정보창을 엽니다.

좌측과 같이 Arguments 항목 하단 좌측의 [+] 버튼을 눌러 Argument에는 "--all"을 입력합니다.

동일하게 아래의 환경변수창에서도 하단의  [+] 버튼을 눌러 Name에 MY_PATH를 Vale에 임의의 디렉토리를 입력합니다.

(참고로 세번째 Debugging 탭을 클릭하시면 사용하는 디버거, 기본 입출력, 원격 디버깅 등 상세한 디버거 정보를 설정할 수 있습니다. 일반적으로는 기본설정된 상태로 사용하시면 됩니다.)

이 제 프로그램을 다시 실행시켜서 결과를 확인 합니다.





아래와 같이 추가된 인자  "--help"와  환경변수 MY_PATH가 "/usr/local/src"로 설정되어  출력되는 것을 확인하실 수 있습니다.



3. 디버거

Xcode 에서 [shift+command+y] 또는 메뉴의 Debug/Debugger를 클릭하여 디버거를 실행합니다. 디버거를 실행하면 상단에서 아래와 같은 메뉴를 확인하실 수 있습니다.


> Build and Debug
빌드를 하고 성공하면 디버그를 실행합니다.

> Terminate
디 버깅시 나타나며 클릭하면 실행과 디버깅을 종료합니다.

> Fix
디버깅 실행중에 소스 수정이 필요할 경우에는 소스를 수정하고 Fix를 실행하면, 종료/재시작 없이 계속 디버깅을 진행할 수 있습니다.

> Restart
Terminage 와 Debug 명령을 동시에 실행하여, 종료 후 바로 디버깅을 재시작합니다.

> Pause
실행을 잠시 멈춥니다.

> Continue
실행이 중지되어 있을 때, 다음 브레이크포인트를 만나기 전이나 오류발생, 종료 전까지 계속 실행합니다.

> Step Over
함수를 만나도 함수내부로 디버깅을 하지 않고, 다음 라인을 실행합니다.

> Ste Into
함수를 만날 경우 함수내부로 진입하여 디버깅을 진행합니다.

> Step Out
현재 함수를 완료하고 호출된 지점으로 돌아 갑니다.

> Breakpoints
현 재 라인에 브레이크포인트를 추가 또는 제거 합니다. 브레이크포인트는 디버깅 진행시 사용자가 확인을 위하여 어플리케이션 실행이 잠시 중지되는 위치 입니다.

> Console
gdb를 직접 사용할 수 있게 해줍니다.


4. 디버깅

1) 브레이크포인트 설정
디버깅 시 가장 중용한 것 중 하나가 브레이크포인트 입니다. 실행 중간 중간 변수 값 확인을 위해서 의심가는 위치에 실행을 정지하기 위해 브레이크포인트를 설정합니다.

브레이크 포인트는 소스코드 에디터상에서 [command+\]나 에디터 좌측의 판넬(gutter)를 더블클릭함으로서 설정/해제할 수 있습니다. 이제 위의 소스에서 b=5; 라고 되어 있는 라인에 브레이크포인터를 설정하고 디버그를 실행합니다.


위와 같이 브레이크포인트가 설정된 라인에서 프로그램 실행이 멈추었습니다. 우측 상단의 현재 변수값들을 확인해 보면 a는 3으로 지정되었으며 b는 아직 5로 설정되기 전이라 스택의 초기화되지 않은 값이 들어 있습니다.


2) 진행
이제 상단의 [Step Over]를 클릭 또는 [command+shift+o]로 한라인을 실행합니다.

좌측과 같이 b=5;의 한라인 실행되고 다음 라인으로 진행되었습니다.

우측 상단을 보시면 방금 변경된 변수 b가 붉은 색으로 5로 설정되어 있음을 알수 있습니다.




여기서 우측 상단의 변수 c를 우클릭하여 Whatch Variable로 설정합니다. Watch Variable은 변수값이 변경되었을 때 사용자에게 알려 줍니다. 설정되면 변수의 좌측에 돋보기 모양의 아이콘이 나타납니다.



이제 [Step Into] 버튼 [command+shift+i]로 plusNum함수 내부로 들어 가보겠습니다. 실행하면 좌측과 같이 plusNum 함수로 들어와 다음 실행을 위해 대기하고 있습니다.

여기서 잠시 중지하고 변수값을 변경해 보겠습니다.


디버거는 실행 중에 변수값을 변경해 가면서 테스트를 할 수가 있습니다. a=3, b=5로 소스코드에서 설정되어 있습니다. 이제 b의 값을 변경해 보겠습니다. 우측 상단 창에서좌측과 같이  b의 값을 10으로 변경합니다.

이제 다시 Step Over로 한 라인을 진행합니다.

진행하면 c는 13으로 되어 있슴을 확인할 수 있습니다. 또한 c는 Watch Variable로 설정되어 있기 때문에 값이 변했을 때 좌측과 같은 메시지 창이 나타납니다.



중요한 변수를 Watch Variable로 설정해 놓으면, 따로 브레이크포인트를 설정하거나 단계별로 진행하지 않더라도 변경시에만 편하게 알려 줍니다.


5. 기타

1) gdb
Xcode는 디버깅에 gdb를 이용합니다.  우측 상단의 [Console] 버튼을 클릭하면 gdb의 상태를 확인하거나 명령어를 직접 수행할 수 있습니다. 아래는 gdb에서 실행된 모습입니다. next 명령어로 한라인을 진행하고 배열 buff의 값을 파일로 덤프해 보았습니다.



 


위와 같이 터미널에서 buff에 들어 있는 메모리 값을 확인할 수 있습니다. gdb의 사용법을 익혀 놓으시면 빠르고 다양한 방법으로 디버깅을 할 수 있습니다.


2) 브레이크포인트 추가 옵션 설정
[option+command+b]로 브레이크포인트 창을 오픈하여 다양한 옵션을 설정할 수 있습니다. 아래는 해당 브레이크포인트 위치로 왔을 때 Log로 알려 주는 옵션입니다. 우측 하단에  Speak로 설정되어 있으므로, 해당 내용을 음성으로 출력합니다. Log로 설정하면 콘솔창으로 출력해 줍니다. 이외에도 다양한 명령어 및 로그를 설정할 수 있습니다.


Xcode 에서 디버깅을 하는 방법에 대해서 간단히 알아 보았습니다. 프로그램은 구현하는 시간외에도 오류를 찾고 수정하는데도 많은 시간이 걸립니다. 디버거를 이용하면 쉽고 빠르게 오류를 찾아 낼 수 있습니다. 또한 디버깅 작업은 메모리리나 컴파일러가 수행하는 작업을 이해하는데 많은 도움을 줍니다.

gdb의 간단한 사용법만 숙지하시면 쉽게 Xcode의 디버깅 작업을 이해하고 수행할 수 있습니다.



출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110085699277

'XCODE' 카테고리의 다른 글

[펌] Xcode 3 둘러보기(1) - Xcode  (0) 2010.06.21
[펌] Xcode 3 둘러보기(3) - 기타  (0) 2010.06.21
[펌] Xcode 에서 디버깅 작업  (0) 2010.06.21
[펌] Xcode 에 Subversion 적용하기  (0) 2010.06.21
[펌] Xcode 단축키  (0) 2010.06.21
[펌] Mac OS X 키보드 단축키  (0) 2010.06.17
Posted by 오늘마감

댓글을 달아 주세요