본문 바로가기

개발도구/iOS - 아이폰 개발

[아이폰] NSUserDefaults

어플의 실행과 동시에 여러 정보들을 NSUserDefaults 을 통해 저장할수 있다.
이것의 특징은 어플을 삭제 하고 다시 재설치 하지 않은 이상 그 현상을 유지한다는것이다.
쉽게 말하자면, 
업데이트 전 A=0
NSUserDefaults 실행 후 
소스변경 A=1 하고 업데이트 후 실행하면 A=0 이 된다.
A=1 을 만들고 싶으면 어플을 삭제하고 다시 설치해야 A=1이 된다.
이유는 NSUserDefaults라는 것으로 디폴트 저장되어 있으면 현상 유지된다는 말이다.

아래의 소스는 어플의 처음실행될때 사용되는 예제. 참고겸 올려 놧습니다.




아래의 내용은 http://kindlybugs.com/220 블로그에서 퍼와서 정리해봅니다.

개발을 하다보면 다양한 값을 저장해야하는일이 생긴다.

서버 디비에 저장하고 끌어다쓰는 일도 있지만 통신없이 저장을 해야하는경우도 생긴다.
예를 들자면 로그인저장상태나 게임세이브파일 같은것?

보편적인 2가지
1) writeToFile:automatically
(Array나 Dictionary 타입을 저장할때 사용하면 편리)

//Dictionary 를 keyCode라는 이름으로 디바이스 로컬에 저장하는 방법

-(void)save:(NSMutableDictionary*)Dictionary ForKey:(NSString*)keyCode 

{

    if( Dictionary == nil || keyCode == nil ) 
    {

        return;

    }

    

    NSString * dataPath = [[NSString stringWithFormat:@"~/Documents/%@", keyCode] stringByExpandingTildeInPath];

    

    [Dictionary writeToFile:dataPath atomically:YES];

    

}

 
//keyCode라는 이름으로 디바이스 로컬에 저장되어있는 Dictionary를 불러오기


 -(NSMutableDictionary*)load:(NSString*)keyCode 

{

    if( keyCode == nil ) 
    {

        return nil;

    }

    

    NSString * dataPath = [[NSString stringWithFormat:@"~/Documents/%@", keyCode] stringByExpandingTildeInPath];

    

    return [NSMutableDictionary dictionaryWithContentsOfFile:dataPath];

}


복잡한 NSData형 자료를 얼마든지 저장,로드 할수 있게 되었다. 

하지만 만일 NSData형이 아닌 NSObject형을 저장해야 한다면?
훨씬 다양한 데이터 타입이나 복잡한 구조를 저장해야 한다면?
이 문제를 해결해줄 2번 후보 등장이다.

2) NSUserDefaults

일단 간단한 소스부터..

//SaveData 라는 Object를 userSaveData라는 이름으로 저장

- (void)saveAccountData:(SaveData *)object

{

    NSUserDefaults * pref = [NSUserDefaults standardUserDefaults];

    NSData * encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];

    [pref setObject:encodedObject forKey:@"userSaveData"];

    //적용

    [[NSUserDefaults standardUserDefaultssynchronize];

}

//userSaveData라는 이름으로 저장된 SaveData를 불러오기

SaveData * saveData = [self loadAccountInfoObjectWithKey:@"userSaveData"]; 


SaveData안에는 NSDate형 NSString형 int형 등등 많은 정보가 들어있다
기본적으로 SaveData같은 NSObject를 상속받는 클래스를 만든후 get,set를 이용 만든후 사용해주면 된다.