1. 每个应用程序位于文件系统的严格限制部分
2. 每个应用程序只能在为该程序创建的文件系统中读取文件
3. 每个应用程序在ios系统内都放在了统一的文件目录下
4. 沙盒路径的位置
1. 通过Finder查找程序沙盒相对路径
~/Library/ApplicationSupport/iPhone Simulator
2. 通过代码查找程序沙盒相对路径
NSSearchPathForDirectoriesInDomains(NSSearchPathDirectorydirectory, NSSearchPathDomainMask domainMask, BOOL expandTilde)
参数1:要搜索哪个文件夹(Document文件夹,tmp文件夹,Library文件夹)
参数2:获得iphone用户文件夹(固定为NSUserDomainMask)
参数3:YES(绝对路径)NO(相对路径)
// 获取沙盒路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
简单对象的读写
- (void)writeString
{
// 获取路径
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"path == %@",path);
// 取出路径
NSString *str = [path objectAtIndex:0];
// 字符串拼接 创建文件 text.txt
str = [NSString stringWithFormat:@"%@%@",str,@"/text.txt"];
// 要写入的字符串
NSString *value = @"蓝翔与杀马特的爱情史";
// 写入文件
NSError *error = nil;
[value writeToFile:str atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"error == %@",error);
}
}
#pragma mark - NSString 读取
- (void)readString
{
NSError *error = nil;
NSString *fileName = @"/text.txt";
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [pathArray objectAtIndex:0];
path = [path stringByAppendingString:fileName];
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"error == %@",error);
}
NSLog(@"str == %@",str);
}
复杂对象的读写
1.复杂对象遵循NSCoding协议
student.h
#import <Foundation/Foundation.h>
// 1. 要存储对象 , 需要要遵循 NSCoding 协议
@interface Student : NSObject <NSCoding>
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *sex;
@property (nonatomic,assign) NSInteger age;
- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;
+ (id)studentWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;
@end
2.重写NSCoding的两个方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
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:(NSInteger)age
{
if (self = [super init]) {
self.name = name;
self.sex = sex;
self.age = age;
}
return self;
}
+ (id)studentWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age
{
Student *stu = [[Student alloc] initWithName:name sex:sex age:age];
return [stu autorelease];
}
#pragma mark - NSCoding 协议必须实现的两个方法
#pragma mark - 归档协议(序列化协议)对象---》二进制
- (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"];
}
#pragma mark - 解档(反序列化) 二进制---》对象
- (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;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"姓名:%@,性别:%@,年龄:%d",_name,_sex,_age];
}
@end
MainViewController.m
#pragma mark - 复杂类型对象存储 ******************************************************************
//归档,即将自己创建的model类对象,转换为二进制格式,通过二进制格式进行存储。
- (void)archiveObject
{
Student *stu = [Student studentWithName:@"蓝翔" sex:@"女" age:16];
//归档,即将自己创建的model类对象,转换为二进制格式,通过二进制格式进行存储。
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stu];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str = [paths firstObject];
str = [NSString stringWithFormat:@"%@/student",str];
[data writeToFile:str atomically:YES];
}
// 解档,将归档后的二进制文件解档为相对应的model类型对象
- (void)unarchiveObject
{
// 解档,将归档后的二进制文件解档为相对应的model类型对象
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str = [paths firstObject];
str = [NSString stringWithFormat:@"%@/student",str];
NSData *data = [NSData dataWithContentsOfFile:str];
Student *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@",model);
}
其它信息的存储方法
#pragma mark - 二进制存储 ************************
- (void)writeData
{
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str = [arr firstObject];
str = [NSString stringWithFormat:@"%@/data",str];
NSString *value = @"蓝翔被菊爆啦,听说没";
// 转换成Data类型 二进制编码格式
NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
// 写入文件
[data writeToFile:str atomically:YES];
}
- (void)readData
{
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str = [arr firstObject];
str = [NSString stringWithFormat:@"%@/data",str];
NSData *data = [NSData dataWithContentsOfFile:str];
NSLog(@"data = %@",data);
NSString *value = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"string = %@",value);
}
#pragma mark - 轻量级存储
#pragma mark - 存储登陆等信息
- (void)userDefaultsWrite
{
// 单例对象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"蓝翔" forKey:@"name"];
// 同步存储 默认异步
[defaults synchronize];
}
#pragma mark - 获取存储登陆等信息 ******************************************************************
- (void)readUserDefaults
{
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
NSLog(@"%@",value);
// 任何地方都可以写
}