-Application - Name --这个目录是你的应用程序包,包括了nib文件,本地化资源,可以执行代码以及别的资源。
1、每个应用程序位于文件系统的严格限制部分
2、每个应用程序只能在为该程序创建的文件系统中读取文件
3、每个应用程序在iOS系统内都放在了统一的文件夹目录下
二:沙盒路径位置
1、通过Finder查找程序沙盒相对路径
~/Library/Application Support/iPhone Simulator
2、通过代码查找沙盒相对路径
NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearchPathDomainMask domainMask,BOOL expandTilde);
三:对象归档的基本概念和用法
1、概念:对象回档是指将对象写入文件保存到硬盘上,当再次打开程序时,可以还原这些对象。你可以将称它为序列化、对象持久化。
2、数据持久性的方式
1)NSKeyedArchive ——————————对象归档
2)NSUserDefaults
3)属性列表化(NSArray、NSDictionary保存文件)
4)SQLite数据库、Core Data数据库
3、归档的形式()
1)对Foundation库中的对象进行归档
2)自定义对象归档(需要实现归档协议,NSCoding)
4、归档后的文件是加密的,属性列表是明文的。
下面我们实现一个model的归档和解档,创建一个Student类,必须遵循NSCoding协议,并且初始化方法,,便利构造器都写好。
Student.h文件:
#import <Foundation/Foundation.h>
@interface Student : NSObject<NSCoding,NSCopying>
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *sex;
@property (nonatomic,assign) NSUInteger age;
+ (id)studentWithName:(NSString*)name sex:(NSString *)sex age:(NSUInteger)age;
@end
Student.m文件
#import "Student.h"
@implementation Student
- (void)dealloc{
[_name release];
[_sex release];
_name = nil;
_sex = nil;
[super dealloc];
}
- (id)initWithName:(NSString*)name sex:(NSString *)sex age:(NSUInteger)age{
if (self = [super init]) {
_name = name;
_sex = sex;
_age = age;
}
return self;
}
+ (id)studentWithName:(NSString*)name sex:(NSString *)sex age:(NSUInteger)age{
Student *stu = [[Student alloc] initWithName:name sex:sex age:age];
return stu;
}
//归档协议或者称为序列化协议
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex forKey:@"sex"];
NSNumber *num= [NSNumber numberWithInt:self.age];
[aCoder encodeObject:num forKey:@"age"];
}
//解档,反序列化
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
NSNumber *num = [aDecoder decodeObjectForKey:@"age"];
self.age = [num intValue];
}
return self;
}
@end
归档:在主控制器里RootViewController.m里引入Student.h头文件
#import "RootViewController.h"
#import "Student.h"
@interface RootViewController ()
@end
#pragma mark archiveObject归档
//即将自己创建的model类型转化为二进制格式,通过二进制格式进行存储
- (void)archiveObject{
Student *stu = [[Student alloc] init];
stu.name = @"理想";
stu.sex = @"女";
stu.age = 38;
//NSArray *arr = [NSArray arrayWithObject:stu];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stu];
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str = [path firstObject];
str = [NSString stringWithFormat:@"%@/model",str];
[data writeToFile:str atomically:YES];
[stu release];
}
解档:
在主控制器里RootViewController.m里引入Student.h头文件
#import "RootViewController.h"
#import "Student.h"
@interface RootViewController ()
@end
#pragma mark unarchiveObject
//解档,将归档后的二进制文件解档为相对应的model对象
- (void) unarchiveObject{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str = [path firstObject];
str = [NSString stringWithFormat:@"%@/model",str];
NSData *data = [NSData dataWithContentsOfFile:str];
Student *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@",model.name);
}
viewDidLoad
在viewDidload里面调用归档和解档方法。- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
//[self searchDocument];
//[self writeStr];
//[self readArrayAndDictionary];
//[self createArrayAndDictionary];
// [self writeData];
// [self readData];
// [self userDefaultsWrite];
// [self readDefautlts];
[self archiveObject];
[self unarchiveObject];
}