본문 바로가기

Objective-C 기초

NSData 다루기 (바이너리 데이터 저장/복원)

반응형

NSData 다루기 (바이너리 데이터 저장/복원)


아카이버 글에서 다뤘듯이, 

NSData로 데이터를 저장/복원 할 때에도 NSKeyedArchiver, NSKeyedUnarchiver 클래스를 사용함.


1) 단일 객체 저장/복원

+(NSData *)archivedDataWithRootObject:(id)rootObject;  //NSData 형태로 받을 때

+(id)unarchiveObjectWithData:(NSData *)data; //NSData를 객체로 반환 받을 때

아카이버의 클래스 메소드를 이용.

로 클래스 메소드를 통해서 간단하게 가능하다.





2) 다수의 객체를 저장/복원

1)번과 같이 클래스 메소드로 가능하지 않음.


인코딩

1) NSMutableData 객체 생성

2) NSMutableData 객체를 인자로 아카이버 객체 생성.

3) 아카이버 객체를 통해 NSData로 인코딩하여 NSMutableData키-밸류 방식으로 하나씩 저장

4) 인코딩을 마치면 -(void)finishEncoding; 메소드를 호출하면 완료.


디코딩

1) NSData 객체를 인자로 NSKeyedUnarchiver 객체 생성.

-(id)initForReadingWithData:(NSData *)data;

2) 언아카이버 객체를 통해 NSData를 'key'에 맞게 디코딩하여 객체로 반환.

-(int)decodeIntForKey:(NSString *)key;

-(float)decodeFloatForKey:(NSString *)key;

-(id)decodeObjectForKey:(NSString *)key;


ex)

Rectangle 클래스 선언부 (Rectangle.h)

#import <Foundation/Foundation.h>


@interface Rectangle : NSObject <NSCoding> //인코딩이 필요한 클래스에서 NSCoding 프로토콜을 채택.


@property int width;

@property int height;


@end



Rectangle 클래스 구현부 (Rectangle.m)

#import "Rectangle.h"


@implementation Rectangle


-(void)encodeWithCoder:(NSCoder *)aCoder{ //NSCoding 프로토콜의 인코딩 메소드 작성

    [aCoder encodeInt:_width forKey:@"WIDTH"];

    [aCoder encodeInt:_height forKey:@"HEIGHT"];

}


//저장된 객체를 복원

-(id)initWithCoder:(NSCoder *)aDecoder{ //NSCoding 프로토콜의 디코딩 메소드 작성

    self = [super init];

    if(self){

        //디코딩 후 멤버변수를 초기화하는 과정

        _width = [aDecoder decodeIntForKey:@"WIDTH"];

        _height = [aDecoder decodeIntForKey:@"HEIGHT"];

    }

    return self;

}


-(NSString *)description{

    return [NSString stringWithFormat:@"사각형 - 가로,세로 (%d, %d)\n", _width, _height];

}


@end



실행 코드 (main.m)

#import <Foundation/Foundation.h>

#import "Rectangle.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        //인코딩을 위한 아카이버 생성

        NSMutableData *mdata = [NSMutableData data]; //NSMutableData 객체 할당

        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mdata]; //아카이버 객체 생성/초기화

        

        Rectangle *rec = [[Rectangle alloc] init];

        rec.width = 10;

        rec.height = 20;

        NSLog(@"my Rectangle : %@",rec);

        

        NSLog(@"Encoding Start ~!");

        //데이터 인코딩

        [archiver encodeInteger:777 forKey:@"INTEGER"]; //NSData형태로 인코딩 되어 NSMutableData인 mdata에 저장됨.

        [archiver encodeObject:@"HELLO_WORLD_!" forKey:@"STRING"];

        [archiver encodeObject:rec forKey:@"RECTANGLE"];

        //인코딩 마무리

        [archiver finishEncoding];

        NSLog(@"Encoding Successed!\n\n");

        

 //------------------------------------------------------------------------------//

        //디코딩을 위한 언아카이버 생성

        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mdata];

        

        NSLog(@"Decoding Start ~!");

        //데이터 디코딩 (NSData -> 객체복원)

        NSInteger num = [unarchiver decodeIntForKey:@"INTEGER"]; //NSData -> 정수 객체 반환

        NSString *str = [unarchiver decodeObjectForKey:@"STRING"]; //NSData -> 문자열 객체 반환

        Rectangle *rec2 = [unarchiver decodeObjectForKey:@"RECTANGLE"]; //NSData -> Rectangle 객체 반환

        NSLog(@"my num : %ld", num);

        NSLog(@"my String : %@", str);

        NSLog(@"my Rectangle : %@",rec2);

        NSLog(@"Finished ~!");

    }

    return 0;

}


==> 결과 :

2019-02-18 14:08:41.316084+0900 Study[8586:1413531] my Rectangle : 사각형 - 가로,세로 (10, 20)

2019-02-18 14:08:41.316307+0900 Study[8586:1413531] Encoding Start ~!

2019-02-18 14:08:41.316629+0900 Study[8586:1413531] Encoding Successed!

2019-02-18 14:08:41.316713+0900 Study[8586:1413531] Decoding Start ~!

2019-02-18 14:08:41.316811+0900 Study[8586:1413531] my num : 777

2019-02-18 14:08:41.316852+0900 Study[8586:1413531] my String : HELLO_WORLD_!

2019-02-18 14:08:41.316902+0900 Study[8586:1413531] my Rectangle : 사각형 - 가로,세로 (10, 20)

2019-02-18 14:08:41.316919+0900 Study[8586:1413531] Finished ~!

Program ended with exit code: 0





반응형

'Objective-C 기초' 카테고리의 다른 글

구조체 Struct  (0) 2019.02.18
블록 (Block)  (0) 2019.02.18
아카이빙(Archiving)  (0) 2019.02.16
프로토콜 (Protocol)  (0) 2019.02.15
클래스 내부 구성요소 숨기기  (0) 2019.02.15