對于app存儲方式有多種萌狂,在這里我們先介紹NSCoding,也就是解檔歸檔灾搏,這種方式是將我們的數(shù)據(jù)存儲在沙盒中的Documents中疼鸟。
首先我們利用NSHomeDirectory來獲取應(yīng)用所存儲的目錄,然后在拼接“Documents”就是我們所用的NSCoding技術(shù)需要準(zhǔn)備的存和取的路徑柏蘑。而實(shí)際上我們可以直接采用[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]來獲取路徑幸冻。
1.NSHomeDirectory
NSString *path1 = NSHomeDirectory();
NSLog(@"path1:%@", path1);path1:/Users/yuanjun/Library/Application Support/iPhone Simulator/4.2/Applications/172DB70A-145B-4575-A31E-D501AC6EA830
2.NSSearchPathForDirectoriesInDomains
NSString *path2 = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"path2:%@", path2);path2:/Users/yuanjun/Library/Application Support/iPhone Simulator/4.2/Applications/172DB70A-145B-4575-A31E-D501AC6EA830/Library/Caches
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"path3:%@", path3);path3:/Users/yuanjun/Library/Application Support/iPhone Simulator/4.2/Applications/172DB70A-145B-4575-A31E-D501AC6EA830/Documents
在獲取到路徑之后我們需要將所存儲的對象遵循協(xié)議NSCoding,之后才可以使用解檔咳焚、歸檔來獲取以及存儲數(shù)據(jù)洽损。
.h文件
@interface YZPerson : NSObject<NSCoding>
.m文件
@implementation YZPerson
// 當(dāng)將一個自定義對象保存到文件的時候就會調(diào)用該方法
// 在該方法中說明如何存儲自定義對象的屬性
// 也就說在該方法中說清楚存儲自定義對象的哪些屬性
// 歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeFloat:self.height forKey:@"height"];
}
// 當(dāng)從文件中讀取一個對象的時候就會調(diào)用該方法
// 在該方法中說明如何讀取保存在文件中的對象
// 也就是說在該方法中說清楚怎么讀取文件中的對象
// 解檔
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.height = [aDecoder decodeFloatForKey:@"height"];
}
return self;
}
在繼承YZPerson的類YZStudent中實(shí)現(xiàn)解檔和歸檔,只需要重寫那兩個方法就可以了革半,并且在.h文件中不需要再次遵循NSCoding協(xié)議
.m文件
@implementation YZStudent
// 在子類中重寫那兩個方法碑定,只添加一個屬性的歸檔,解檔
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeFloat:self.weight forKey:@"weight"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
self.weight = [aDecoder decodeFloatForKey:@"weight"];
}
return self;
}
@end
在外部實(shí)現(xiàn)存儲以及讀取時
存儲
NSString *stuPath = [docPath stringByAppendingString:@"student.student"];
// 3. 將自定義的對象保存到文件中
[NSKeyedArchiver archiveRootObject:person toFile:path];
讀取
NSString *stuPath = [dirPath stringByAppendingString:@"student.student"];
YZStudent *student = [NSKeyedUnarchiver unarchiveObjectWithFile:stuPath ];