用NSKeyedArchiver存儲數據(歸檔)


一、NSKeyedArchiver和NSUserDefault的區別

NSUserDefault只能存儲基本數據類型,如NSInteger NSString NSArray 但像UIImage就存不進去

將各種類型的對象存儲到文件中,而不僅僅是字符串、數組和字典類型,有一種更靈活的方法。就是利用NSKeyedAarchiver類創建帶鍵(keyed)的檔案來完成。

 

二、用法

 所存儲的對象必須必須服從NSSecureCoding協議

1、對於已經服從的類型,如NSString、NSInteger可以直接使用

NSKeyedArchiver-歸檔

 //1.對需要保存的數據進行編碼 ->NSdata *
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@"ios" requiringSecureCoding:YES error:nil]; //2.將二進制數據保存到文件 //創建文件
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //創建文件
 [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; [data writeToFile:path atomically:YES];

NSKeyedUnarchiver-解歸檔

    //解歸檔 //獲取文件路徑
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //讀取文件的內容
    NSData *data = [NSData dataWithContentsOfFile:path]; //將二進制數據轉化為對應的對象類型
   NSString *str = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSString class] fromData:data error:nil]; NSLog(@"%@", str);

 

2.對於其他類型,如自己創建的模型,需要服從協議,並且實現某些方法

Person.h

#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface Person : NSObject<NSSecureCoding> @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; @end NS_ASSUME_NONNULL_END

Person.m實現一些方法

#import "Person.h"

@implementation Person + (BOOL)supportsSecureCoding{ return YES; } //歸檔的時候調用 //告訴編碼器該如何歸檔 //將這個對象哪些屬性編碼起來
- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInteger:self.age forKey:@"age"]; } //解歸檔
- (instancetype)initWithCoder:(NSCoder *)aDecoder{ if ([super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntegerForKey:@"age"]; } return self; }

使用

ViewController.m 歸檔

 //創建Person對象
    Person *jz = [Person new]; jz.name = @"jz"; jz.age = 12; //1.對需要保存的數據進行編碼 ->NSdata *
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:jz requiringSecureCoding:YES error:nil]; //2.將二進制數據保存到文件 //創建文件
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //創建文件
 [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; [data writeToFile:path atomically:YES];

解歸檔

 //解歸檔 //獲取文件路徑
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //讀取文件的內容
    NSData *data = [NSData dataWithContentsOfFile:path]; //將二進制數據轉化為對應的對象類型
    Person *jz = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:data error:nil]; NSLog(@"%@", jz);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM