Objective-C 아카이빙


  1. 아카이빙이란? 데이터를 저장하고, 불러올 수 있는 메카니즘을 의미한다.
    1. 아카이빙 메커니즘에 대한 그림은 아래와 같다.
    2. 아카이빙에서는 아카이버를 이용하여 데이터를 저장하고, 언 아카이버를 이용하여 저장한 데이터를 불러온다.
      1. iOS용 파운데이션
        1. 아카이버 : NSKeyedArchiver
        2. 언 아카이버 : NSKeyedUnarchiver
    3. 아카이빙을 사용하기 위해서는 우선 NSCoding 프로토콜에 대해서 알아야한다.
      1. NSCoding 프로토콜
        1. 객체를 저장하고, 불러올 수 있는 encoding/decoding 메소드를 제공한다.
        2. 구성은 아래와 같다.
          NSCoding 프로토콜
          @protocol NSCoding
          -(void)encodeWithCoder:(NSCoder *)aEncoder;
          -(id)initWithCoder:(NSCoder *)aDecoder;
          @end
        3. NSCoder를 클래스에서 인코딩 시에 키-값 형태로 저장한다.
          NSCoding 프로토콜 채택 후 구현
          // encoding
          -(void)encodeWithCoder:(NSCoder *)aEncoder {
             [aEncoder encodeInt:10 forKey:@"TEST"];
          }

          // decoding
          -(id) initWithCoder:(NSCoder *) aDecoder {
             self = [super init];
             if(self) {
                int value = [aDecoder decodeIntForKey:@"TEST"];
             }
             return self;
          }
    4. NSCoding 프로토콜로 정의된 객체에 아카이빙을 이용하여 파일로 저장하거나 NSData로 저장 후에 다시 불러올 수 있다.
      1. 파일로 저장 후 불러오기
        아카이빙을 파일을 이용
        // 파일에 저장
        ClassName *obj = [[ClassName alloc] init];
        // 객체 값 설정
        NSString *filePath = @"파일경로";
        [NSKeyedArchiver archiverRootObject:obj toFile:filePath];
        // 파일로 저장하면서 자동으로 인코딩 메소드 동작

        // 파일에 저장된 내용 불러오기
        ClassName *obj2 = [NSKeyedUnarchiver unarchiverObjectWithFile:filePath];
        // 파일에서 읽어오면서 자동으로 디코딩 코드 동작
      2. NSData를 이용하여 저장 후 불러오기
        아카이빙을 NSData를 이용
        // NSMutableData에 저장
        NSMutableData *mdata =  [NSMutableData data];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mdata];
        // 데이터 인코딩
        [archiver encodingObject:@"ClassName" forKey:@"STRING"];
        // 인코딩 마무리
        [archiver finishEncoding];

        // NSMutableData에 저장된 내용 불러오기
        NSKeyedUnarchiber *unarchibver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mdata];
        // 데이터 디코딩
        NSString *str = [unarchiver decodingObjectForKey:@"STRING"];

      3. 아래는 NSData를 이용한 데이터 저장 및 불러오기를 구현한 소스이다.
      4. 위의 소스 코드를 실행하면 아래와 같은 결과를 얻을 수 있다.