2011-02-17 7 views
1

저는 앱 전체에 영구 설정을 유지하려는 클래스가 있습니다. 이 클래스는 다음과 같이 정의된다싱글 톤을 사용하여 보관하기

@interface Archive : NSCoder <NSCoding> { 
    NSString *fromAddress; 
    NSString *toAddress; 
... more ... 
} 

@property(nonatomic,retain) NSString *fromAddress; 
@property(nonatomic,retain) NSString *toAddress; 

+ (Archive *)sharedArchive; 

-(void)encodeWithCoder:(NSCoder *)aCoder; 
-(id)initWithCoder:(NSCoder *)aDecoder; 

그리고로 구현 :

@synthesize fromAddress, toAddress; 

+ (Archive *)sharedArchive 
{ 
    if (sharedArchive == nil) { 
     NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:@"mydata"]; 
     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
     sharedArchive = [unarchiver decodeObjectForKey:@"myapp"]; 
     [unarchiver finishDecoding]; 
    } 
    return sharedArchive; 
} 

+ (id)allocWithZone:(NSZone *)zone 
{ 
    sharedArchive = [super allocWithZone:NULL]; 
    return sharedArchive; 
} 

- (id)copyWithZone:(NSZone *)zone 
{ 
    return self; 
} 

- (id)retain 
{ 
    return self; 
} 

- (NSUInteger)retainCount 
{ 
    return NSUIntegerMax; 
} 

- (void)release 
{ 
    //do nothing 
} 

- (id)autorelease 
{ 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:self.fromAddress forKey:@"fromAddress"]; 
    [aCoder encodeObject:self.toAddress forKey:@"toAddress"]; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder { 
    self = [self initWithCoder:aDecoder]; 
    fromAddress = [[aDecoder decodeObjectForKey:@"fromAddress"] retain]; 
    toAddress = [[aDecoder decodeObjectForKey:@"toAddress"] retain]; 
    return self; 
} 

응용 프로그램 위임 applicationWillTerminate 방법 :

- (void)applicationWillTerminate:(UIApplication *)application { 
    /* 
    Called when the application is about to terminate. 
    See also applicationDidEnterBackground:. 
    */ 
    NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    [archiver encodeObject:[Archive sharedArchive] forKey:@"myapp"]; 
    [archiver finishEncoding]; 
    [data writeToFile:@"myapp" atomically:YES]; 
} 

I 보관 해제 아카이브 /이 개념에 새로운입니다. 문제는 데이터 파일에서 다시 읽을 수 없다는 것입니다. 나는 다음과 같은 오류가 발생합니다 :

- [NSKeyedUnarchiver initForReadingWithData이 :] : 데이터가 NULL

사람이 내가 잘못 뭐하는 거지 설명 할 수 있을까요? 또는 영구 데이터를 저장/복원하는 더 좋은 방법 일 수 있습니다. NSUserDefaults 클래스를 살펴 보았지만 내 경우에 맞지 않는다고 생각합니다 ... 사용자 환경 설정을 저장하려고하지 않습니다.

답변

1

두 문자열 만 저장 하시겠습니까? NSUserDefaults를 사용하십시오.

NSUserDefaults를 사용하지 않으려면 writeToFile 및 readFromFile에 @ "myapp"대신 실제 경로를 제공해야합니다.

NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
NSString *path = [libraryPath stringByAppendingPathComponent:@"myApp"]; 
[data writeToFile:path atomically:YES]; 

당신은 또한 NSMutableData *data을 해제해야하고 BTW

NSKeyedUnarchiver *unarchiver[writeToFile:atomically:] 쓰기가 성공 여부를 알려주는 BOOL을 반환합니다.

btw2, - (void)applicationWillTerminate:(UIApplication *)application은 멀티 태스킹이 활성화 된 iOS4에서 자주 호출되지 않습니다. 저장 기능을 applicationDidEnterBackground:에도 넣어야합니다.

+0

첫 번째 문장에서 끝나야합니다. :) – bbum

+0

아니요, 실제로 두 개 이상의 문자열이 필요합니다. 이 예제를 사용하여 코드를 단축했습니다. 나는 당신의 제안을 따르고 내가 나의 목표와 함께 더 나아갈 수 있는지보기 위해 노력할 것입니다. 감사 – Raisen

0

@fluchtpunkt이 맞습니다. "이 두 문자열을 저장하고 싶습니까? NSUserDefaults를 사용하십시오."

또는 더 구체적으로, 경우 :

have a class where I want to keep persistent settings throughout my app.

는 데이터의 몇 가지 중요한 수량 지속 할 필요가없는 한

- 대형에 BLOB 등을 - 당신이 NSUserDefaults을 사용해야합니다.

앱 종료시 앱 보관 및 보관 취소에 의존하기 때문에 잠재적 인 문제가 발생할 수 있습니다. 앱이 항상 종료되지 않고 "앱 전체에서"사용되는 출시시 여러 가지 항목을 보관 취소 할 수있는 것은 아닙니다 (예 : 아니요, 앱 시작시이 아님). 앱 시작 시간을 느리게 만듭니다.

에는 실행 사이에 유지되어야하는 많은 양의 상태가 있습니다. 그러면 보관/보관 처리가 확실히 작동 할 수 있습니다. 그러나 이 아닐 경우과 아카이브를 연결해야합니다. 앱이 강제 종료되거나 던져 지거나 기기가 하드 재부팅되는 경우 (많은 사용자가 부적절한 페티쉬를 사용하는 경우) 데이터를 잃어 버리게할까요?

관련 문제