DirTy™의 하루일과/DirTy™의 가당찮은iOS

[IOS] 초보자도 할수있는 singleton 패턴

DirTy™ 2015. 1. 12. 14:52

싱글톤... singleton 프로그래밍에서는 아주 자주 접하는 말이다.

말그대로 싱글 = 하나라는 뜻으로 프로그램안에서 하나의(혹은 제한된 갯수) 객체만을 생성하고 이를 프로그램이 죽을때까지 쓴다는(해제하고 다시만들수도있지만) 개념이다.


장점이라면 무분별한 객체 생성을 방지할수 있고

단점이라면... 전역변수랑 다를것이없고 구조가 변경될 경우 변경되는 부분이 많아질 수있다는점??


써도되고 안써도 되지만 나같은 경우는 전역변수로 많이 쓰는 편인데 그래도 쓰고싶어서 한번 사용해 보았다. 아래와 같이 테스트용으로 만들었고 결과는 잘된다.


loginDataSingleton.h

#define loginFilename @"Login.plist" //로그인정보 파일명


#import <Foundation/Foundation.h>


@interface LoginDataSingleton : NSObject {

    BOOL auto_login; // 자동 로그인 플래그

    NSString *user_id; // 로그인 아이디

    NSString *user_pass; // 로그인 패스워드

}


+ (LoginDataSingleton *)getSingletonObject; // 싱글톤 객체를 얻을 클래스 메서드


@property (nonatomic, assign) BOOL auto_login; // 자동 로그인 플래그

@property (nonatomic, strong) NSString *user_id; // 로그인 아이디

@property (nonatomic, strong) NSString *user_pass; // 로그인 패스워드


- (NSString *)dataFilePath; // 로그인 파일 경로

- (void)readLoginData; // 로그인 데이터 읽기

- (void)writeLoginData:(NSArray *)loginDataArray; // 로그인 데이터 쓰기

@end


loginDataSingleton.m

#import "LoginDataSingleton.h"


@implementation LoginDataSingleton


@synthesize auto_login;

@synthesize user_id;

@synthesize user_pass;


+ (LoginDataSingleton *)getSingletonObject {

    static LoginDataSingleton *sharedInstance = nil;

    

 // nil일 경우에만 생성하고 아닐경우에는 이미 생성되어있기 때문에 객체를 반환한다.

    if(sharedInstance == nil) {

        @synchronized(self) {

            if(sharedInstance == nil) {

                sharedInstance = [[LoginDataSingleton alloc] init];

            }

        }

    }

    

    return sharedInstance;

}


- (NSString *)dataFilePath {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    return [documentsDirectory stringByAppendingPathComponent:loginFilename];

}


- (void)readLoginData {

    NSString *filePath = [self dataFilePath];

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {

        NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];

        

        if([[array objectAtIndex:2] isEqual:@"0"] == 1) {

            self.user_id = @"";

            self.user_pass = @"";

            self.auto_login = FALSE;

        } else {

            self.user_id = [array objectAtIndex:0];

            self.user_pass = [array objectAtIndex:1];

            self.auto_login = TRUE;

        }

    }

}


- (void)writeLoginData:(NSArray *)loginDataArray {

    

    [loginDataArray writeToFile:[self dataFilePath] atomically:YES];

}

@end