iOS 歸檔反歸檔 詳解

創(chuàng)建一個 Person 類

//定義基本屬性
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *gender;
@property(nonatomic,assign)int age;

1,首先,復(fù)雜對象所屬的類要遵循<NSCoding>協(xié)議

@interface Person : NSObject<NSCoding>

2,-(void)encodeWithCoder:(NSCoder *)aCoder;序列化/歸檔

/歸檔(序列化)
//對person對象進(jìn)行歸檔時,此方法執(zhí)行
//對person中想要進(jìn)行歸檔的所有屬性,進(jìn)行序列化操作
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    [aCoder encodeInt:self.age forKey:@"age"];
}

3:-(instancetype)initWithCoder:(NSCoder *)aDecoder;反序列化

//反歸檔(反序列化)
//對person對象進(jìn)行反歸檔時,該方法執(zhí)行
//創(chuàng)建一個新的person對象,所有屬性都是通過反序列化得到
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.gender = [aDecoder decodeObjectForKey:@"gender"];
        self.age = [aDecoder decodeIntForKey:@"age"];
    }

    return self;
}

復(fù)雜對象寫入文件

#pragma mark  --復(fù)雜對象寫入文件
-(void)archiver
{
    Person *per = [Person new];
    per.name = @"小美眉";
    per.gender = @"女";
    per.age = 18;
    
    
    //準(zhǔn)備路徑:
    NSString *path = NSHomeDirectory();
    NSLog(@"%@",path);
    
    path = [path stringByAppendingPathComponent:@"singeGirl.txt"];
    //1:準(zhǔn)備存儲數(shù)據(jù)的對象
    NSMutableData *data = [NSMutableData data];
    //2:創(chuàng)建歸檔對象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //3:開始?xì)w檔
    [archiver encodeObject:per forKey:@"person"];
    //4:完成歸檔
    [archiver finishEncoding];
    //5:寫入文件當(dāng)中
    BOOL result = [data writeToFile:path atomically:YES];
    if (result) {
        NSLog(@"歸檔成功:%@",path);
    }else
    {
        NSLog(@"歸檔不成功!!!");
    }
    

#pragma mark ---  反歸檔/反序列化/解碼/解檔 ----
    //準(zhǔn)備解檔路徑
    NSData *myData = [NSData dataWithContentsOfFile:path];
    //創(chuàng)建反歸檔對象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:myData];
    //反歸檔
    Person *aper = [Person new];
    aper = [unarchiver decodeObjectForKey:@"person"];
    //完成反歸檔
    [unarchiver finishDecoding];
    //測試
    NSLog(@"%@",aper.name);
    NSLog(@"%@",aper.gender);
}

Foundation框架對象 歸檔

-(void)foundationClassArchiver
{
   //獲取文件路徑
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"archiverFile"];
    //歸檔
    NSArray *archiverArray = @[@"小蘿莉",@"小正太",@"UI",@"OC"];
    BOOL result = [NSKeyedArchiver archiveRootObject:archiverArray toFile:filePath];
    
    if (result) {
        NSLog(@"歸檔成功:%@",filePath);
    }else
    {
        NSLog(@"歸檔失敗");
    }
    
    //反歸檔
    NSArray *unarchiverArr = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    
    NSLog(@"%@",unarchiverArr);
}


對自定義的內(nèi)容進(jìn)行歸檔

//獲取文件路徑
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    //在document文件夾下,創(chuàng)建新的文件
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"customFile"];
    
    //1:使用Data對象進(jìn)行歸檔
    NSMutableData *archiverData = [NSMutableData data];
    //2:創(chuàng)建歸檔對象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
    //3:自己定義數(shù)據(jù)內(nèi)容(數(shù)據(jù)內(nèi)容以鍵值對的形式存在)
    [archiver encodeObject:@"尼古拉斯.趙四" forKey:@"ZS"];
    [archiver encodeObject:@[@"愛新覺羅",@"努爾哈赤",@"葉赫那拉"] forKey:@"name"];
    [archiver encodeInt:28 forKey:@"age"];
    //4:完成歸檔
    [archiver finishEncoding];
    //5:寫入
    BOOL result = [archiverData writeToFile:filePath atomically:YES];
    
    if (result) {
        NSLog(@"歸檔成功:%@",filePath);
    }
    
    
    //反歸檔
    //1:讀取文件,生成NSData類型
    NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];
    //2:創(chuàng)建反歸檔對象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
    //3:反歸檔.根據(jù)可以訪問
    NSString *ZS = [unarchiver decodeObjectForKey:@"ZS"];
    NSLog(@"%@,%@",ZS,filePath);

NSUserDefaults

-(void)writeNSUserDf
{

   /*
    NSUserDefaults是一個單例,在整個應(yīng)用程序當(dāng)中只有一個實(shí)例對象,他可以用于數(shù)據(jù)的永久保存,簡單實(shí)用,這是它可以讓數(shù)據(jù)自由傳遞的一個前提.
    NSUserDefaults:它可以存儲一些類型的數(shù)據(jù):NSNumber,NSString,NSData,NSArray......
    */
    
//    NSUserDefaults
    NSArray *arrays = @[@"橘子",@"香蕉",@"西瓜",@"草莓",@"大蘋果"];
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    //存
    [user setObject:arrays forKey:@"userarrays"];
    
    //取
    NSArray *strings = [user objectForKey:@"userarrays"];
    NSLog(@"%@",strings);
    
    
    
#warning 注意:對相同的key賦值約等于一次覆蓋,要保證每一個key的唯一性
//    NSUserDefaults 存儲的對象完全是不可變的(這一點(diǎn)十分關(guān)鍵,如果弄錯會出現(xiàn)bug),例如,如果我想要存儲一個NSMutableArray對象.我必須先創(chuàng)建一個不可變數(shù)組(NSArray),然后在去存入
    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"456",@"789", nil];
    NSArray *array = [NSArray arrayWithArray:mutableArray];
    
    NSUserDefaults *user2 = [NSUserDefaults standardUserDefaults];
    
    [user2 setObject:array forKey:@"我們這里存放的一定是不可變的"];
    
    
    //自定義數(shù)據(jù)類型存儲到NSUserDefaults
    Person *per = [Person new];
    per.name = @"小白";
    per.age = 14;
    per.gender = @"男";
    //創(chuàng)建存放person的數(shù)組
    NSMutableArray *dataArray = [NSMutableArray arrayWithCapacity:0];
    //將person類型轉(zhuǎn)換成為NSData類型
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:per];
    //將data存入到數(shù)組當(dāng)中
    [dataArray addObject:data];
    NSUserDefaults *user1 = [NSUserDefaults standardUserDefaults];
    [user1 setObject:data forKey:@"person"];
    NSLog(@"%@",user1);
    
    //取出數(shù)據(jù)
    NSUserDefaults *user3 = [NSUserDefaults standardUserDefaults];
    NSData *data3 = [user3 objectForKey:@"person"];
    Person *per3 = [NSKeyedUnarchiver unarchiveObjectWithData:data3];
    NSLog(@"%@",per3);
    
 
    
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NSCoding1、為了將應(yīng)用數(shù)據(jù)存儲到硬盤中,iOS提供基本的文件API、Property List序列化、SQ...
    iOS_愛OS閱讀 3,166評論 0 0
  • 1.新建類 “Person ”2.Person .h@interface Person : NSObject<N...
    任任任任師艷閱讀 752評論 0 3
  • 歸檔與反歸檔 復(fù)雜對象就是在Foundation框架內(nèi)不存在的數(shù)據(jù)類,例如我們自定義的Person類。 復(fù)雜對象無...
    Joker_King閱讀 2,882評論 4 4
  • 把 OC 中基本數(shù)據(jù)存儲到沙盒中,被稱為基本數(shù)據(jù)持久化。 基本數(shù)據(jù),在 oc中有以下四種,分別為 NSString...
    flyrees閱讀 1,254評論 0 0
  • 一、歸檔的基本概念 之前將數(shù)據(jù)保存本地,只能是字符串、數(shù)組、字典、NSNuber、BOOL等容器類對象對象,不能將...
    空白Null閱讀 5,343評論 1 10

友情鏈接更多精彩內(nèi)容