본문 바로가기

iOS개발팁

싱글턴을 활용하자.

앱을 제작하다 보면 모든 객체들간에 공유되어야 할 내용들이 있습니다. 웹프로그래밍에서의 사용자 세션 같은 것이나 간단한 DB, 환경 설정 내용 등이 있을 것입니다. 특히 아이폰에서 뷰컨트롤러간에 전이가 자주 일어날 때에 뷰간에 공유해야할 내용이 생기게 마련입니다. 이런 전역변수 성격이 강한 공유데이터는 어디에 두어야 할까요?

이전에는 주로 AppDelegate에 두었지만 AppDelegate가 자신과 관련도 없는 데이터를 가지고 있는 것이 쫌 그렇습니다. 이럴 때 싱글턴 패턴을 활용하여 사용하면 좋습니다. 즉, 전역 데이터만 관리하는 관리자를 만들어 사용하는 것입니다. 아래처럼 말이죠.
GlobalDataManager *gdm = [GlobalDataManager sharedGlobalDataManager];
...
... 원하는 작업
...
GlobalDataManager의 생성은 지연생성기법을 사용하여 sharedGlobalDataManager 클래스메서드를 호출했을 때 해당 객체가 만들어져 있지 않으면 그 때 가서 만들어 반환하고 만들어져 있으면 기존 객체를 반환합니다. 따라서 따로 GlobalDataManager의 생성 코드가 필요치 않습니다.

코코아 프레임워크에서도 싱글턴 패턴을 많이 사용하기에 애플에서 싱글턴패턴을 만드는 방법을 문서로 제공하고 있습니다. 바로 Creating a Singleton Instance 문서입니다. 이 문서의 내용을 매크로 함수로 제공해 주는 고마운 블로거도 있습니다. 이 블로거는 전역 변수가 필요한 경우를 설명하고 전역 변수를 보관하는 방법으로 싱글턴 패턴을 아주 잘 설명하고 있습니다.  Singletons, AppDelegates and top-level data 이 문서를 꼭 읽어 보세요. 지금 이 글도 저 문서를 바탕으로 쓰고 있는 것입니다. :) 그럼 위의 싸이트에서 제공하는 매크로를 사용하여 예시 코드를 만들어 보겠습니다.
@interface GlobalDataManager : NSObject
{
    NSString *name;
}
+ (GlobalDataManager *) sharedGlobalDataManager;
@property (nonatomic, retain) NSString *name;
@end
단순히 NSString만을 관리하는 전역 데이터 관리자입니다. 아래는 구현부입니다.
#import "GlobalDataManager.h"
#import "SynthesizeSingleton.h"

@implementation GlobalDataManager
@synthesize name;
SYNTHESIZE_SINGLETON_FOR_CLASS(GlobalDataManager);
- (id) init
{
    if(self = [super init])
    {
        self.name = @"test";
    }
    return self;
}
- (void) dealloc
{
    [name release];
    [super dealloc];
}
@end
매크로 함수로 인해 구현이 매우 간결해 졌습니다. 사용은 아래처럼 하면 됩니다.
- (BOOL)application:(UIApplication *)application
   didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
   
    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
   
    NSLog(@"%@", [GlobalDataManager sharedGlobalDataManager].name);

    return YES;
}
너무 심플한 코드이기에 설명은 생략하겠습니다 ;) 싱글턴을 활용하여 해피코딩하세요!

소스코드

'iOS개발팁' 카테고리의 다른 글

Twitter-OAuth-iPhone 라이브러리 소개  (0) 2010.10.05
안전하게 현재 날짜 구하기.  (0) 2010.09.24
컬러픽커 만들기  (2) 2010.07.30
아이폰과 아이패드 구분하기  (0) 2010.07.29
아이폰 OpenGL ES 튜토리얼 01  (9) 2010.07.19