沙盒机制,写入读取,归解档入门

来源:互联网 发布:java邮件功能 编辑:程序博客网 时间:2024/06/16 14:41


                                   沙盒机制


——————————————沙盒
沙盒 :每个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立,封闭,安全的空间,叫做沙盒 
注意: 1:每一个应用程序都会拥有一个应用程序沙盒 
       2: 应用程序沙盒就是一个系统目录 
       独立: 不可能出现两个程序公用同一个沙盒
      封闭 : 每一个沙盒都只能他自己的应用去使用
     安全 :沙盒  有被删除的失效

手动自动存入东西 

——————————————文件夹
文件夹
  • Documents :  1:存入一些永远不被删除的文件(不会被系统主动删除),itunes备份时,同时也会备份Documents文件(条件:尽量不在Documents放入音频视频等太大的东西,只放一些重要文件,以免审核被拒) 注:可以存,有方法让什么
  • Library :   1Caches : 存储缓存的文件夹 当用户对某一个URL做请求操作的时候,这个URL里面的东西会保存在主机里面的某个位置 .Cookie 和Session .(itunes不会备份此目录,文件不会再应用退出时删除,一般存放比较大,不是特别重要的资源)
     
                 2: Preferences 保存应用的所有偏好设置.iOS的Settings(设置)应用会该目录中查找应用的设置信息,iTunes会备份它,  注意:不应该直接创建偏好设置文件,而是应该使用类来取得和设置应用程序的偏好 
                 
  • tmp:保存应用运行时所需的临时数据,使用完毕后会将相应的文件从该目录删除.应用没有运行时或者手机重启时,系统也有可能会清除该目录下的文件,iTunes 不会同步该目录

获取文件夹方法 
  •       第一种 : 通过该NSSeach搜索文件夹得地址,能获取Documents 和Library 内部文件夹地址,但是不能获取tmp文件夹得地址,其他的都可以获取到.

      //NSDocumentDirectory 表示获取Documents文件夹得地址
   
//NSLibraryDirectory / NSCachesDirectory
   
//NSUserDomainMask  表示用户的主目录
   
//第三个参数表示展开"~"的地址,设置为YES为完整路径
   
//NSSearchPathForDirectoriesInDomains获取的是一个数组(NSArray*),数组只有一个元素,所以可以直接获取objectAtIndex:0 ;
   
NSString *documentPathStr= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
   NSLog(@"%@",documentPathStr);
  •      第二种  :首先获取沙盒主路径的地址,然后拼接上想要去的文件夹的地址.
   
   //首先获取沙盒主路径的地址
   
NSString *homePathStr= NSHomeDirectory();
   
NSLog(@"homePathStr= %@",homePathStr);
   
//其次:在沙盒主路径后拼接Documents,拼接出来documents文件夹的路径
   
NSString *documentsPathStr= [homePathStr stringByAppendingPathComponent:@"Library/Caches"];
   
NSLog(@"documents= %@",documentsPathStr);
   
//获取tmp文件夹得路径
   
NSString *tmpPathStr= NSTemporaryDirectory();
   NSLog(@"tmpPathStr= %@",tmpPathStr);




             简单对象的写入与读写



——————————————数据本地化
     把数据的,存储到应用程序的沙盒里面
  •   写入
   //1 . 要知道存到哪里 ,So需要一个文件夹的路径
   
NSString *documentsPathStr= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
   
NSLog(@"%@",documentsPathStr);
   
//2 . 知道要存什么创建数据
   
NSString *str= @"hello world";
   
//3 . 要知道数据放哪里 , 创建一个路径,路径的终点局势存数据的文件Component(成分)
   
NSString *strPath= [documentsPathStr stringByAppendingPathComponent:@"str.txt"];
   
//4 . 写入操作
   
// atomically : YES 正当手机没电关机会保存文件
   
//             NO  
   
// encoding : 编码方式
    [str
writeToFile:strPathatomically:YESencoding:NSUTF8StringEncodingerror:nil];
  
  •  读取
    //通过路径读取数据,使用stringWithContentsOfFile方法,在读取的时候,第一个参数表示读取文件的路径,第二个参数表示编码格式,第三个表示错误信息.
   NSString *newStr= [NSStringstringWithContentsOfFile:strPathencoding:NSUTF8StringEncodingerror:nil];

沙盒机制,写入读取,归解档入门

——————————————NSData
   
  • 写入
   //1
   NSString *documentPathStr= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
    //2
    UIImage *image= [UIImageimageNamed:@"123"]; 
   //UIImage类型对象转化成NSData类型的
   //第一个参数:转哪个UIImage类型对象
   //第二个参数:压缩系数,越小压缩越厉害
   NSData *data=UIImageJPEGRepresentation(image,1); 
   //3
   NSString *stringPath= [documentPathStr stringByAppendingPathComponent:@"stringPath.txt"];
   //4
   [data writeToFile:stringPathatomically:YES];
   
  • 读取数据
   NSData *newData= [NSDatadataWithContentsOfFile:stringPath];
   
UIImage *newImage= [UIImageimageWithData:newData];
   
UIImageView *newImageView= [[UIImageViewalloc]initWithImage:newImage];
   [self.viewaddSubview:newImageView];




                            复杂对象的写入与读取

           
 什么是复杂对象? 
    在Foundation框架内不存在的数据类,如自定义Person类等无法在程序内通过writeToFile: 这个方法写入文件内
    只能通过将负载对象转化为NSData,即归档
沙盒机制,写入读取,归解档入门

 沙盒机制,写入读取,归解档入门
——————————————归解档

           
#import
// 如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议
@interface Person: NSObject<</span>NSCoding>

@property(nonatomic,copy)NSString*name;

@property(nonatomic,copy)NSString*gender;

@property(nonatomic,assign)NSUInteger age;

//nonatomicassign copy atomic weak strong readonly readwrite writeonly nonnullnullable retain unsafe_unretained

//_+属性名命名的成员变量
//
@end

                
#import "Person.h"

@implementationPerson

//归档
//在归档和解档的时候,要把所有的属性都进行归解档
-(
void)encodeWithCoder:(NSCoder*)aCoder{
   [aCoder
encodeObject:self.nameforKey:@"name"];
   [aCoder
encodeObject:self.genderforKey:@"gender"];
   [aCoder
encodeInteger:self.ageforKey:@"age"];
}

//解档
-(
instancetype)initWithCoder:(NSCoder*)aDecoder{
   
if (self=[superinit]){
       
self.name=[aDecoder decodeObjectForKey:@"name"];
       
self.gender=[aDecoder decodeObjectForKey:@"gender"];
       
self.age=[aDecoder decodeIntegerForKey:@"age"];
    }
   
returnself;
}
@end


#import "ViewController.h"
#import
"Person.h"

@interfaceViewController()

@end

@implementationViewController

- (
void)viewDidLoad{
   [
superviewDidLoad];
   // 如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议

   Person *person= [[Personalloc]init];
   person.
name=@"";
   person.
gender=@"";
   person.
age=38 ;
   
#pragma mark ------归档
   //将复杂对象归档之后存入本地
   //1 :创建一个NSMutableData,用于保存归档后的对象(初始化归档工具)
   NSMutableData *data= [NSMutableDatadata];
   //2 :创建个归档工具
   
NSKeyedArchiver *keyedArchiver= [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];
   //3 :归档
   [keyedArchiver encodeObject:personforKey:@"person"];
   //第4 步: 结束归档
   [keyedArchiver finishEncoding];//这时候才Data存储好数据
   NSLog(@"data= %@",data);
   //获取,拼接写入沙盒路径
 NSString *documentPathStr= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
   NSString *dataPath= [documentPathStr stringByAppendingPathComponent:@"person.plist"];
   //x写入
   [data writeToFile:dataPathatomically:YES];
   
   
   
#pragma mark --------解档并使用
   //1 :从本地获取到Data
   
NSData *newData = [NSDatadataWithContentsOfFile:dataPath];
   
NSLog(@"%@",newData);
   
//2 :通过获取到的data创建一个解档工具
   
NSKeyedUnarchiver *keyedUnarchiver= [[NSKeyedUnarchiveralloc]initForReadingWithData:newData];
   
//3 :创建一个Person对象,接收解档结果
   
Person *newPerson= [keyedUnarchiver decodeObjectForKey:@"person"];
   
//4 :结束解档
   [keyedUnarchiver
finishDecoding];
   
//
   
NSLog(@"%@",newPerson);
   
   
//归解档是一种编码方式,不是数据本地化的方式
   
//负载对象写入本地实际上使用的还是writeToFile的简单写入本地的方法
   
//整存整取writeToFile
   //在一个路径下存数据,最后一次存进去的东西会覆盖之前的



总结



  • 简单对象写入文件过程: 
  1. 创建字符串获取存储文件的文件夹路径
  2. 创建需要存储的数据
  3. 创建字符串通过拼接创建并获得存储文件的路径
  4. 写入 writeToFile

  • 读取: 通过路径读取数据,使用stringWithContentsOfFile方法

  • 归档:
  1. 创建对象 (并设置属性)
  2. 遵循NSCoding协议,并实现方法
  3. 创建实例对象
  4. 创建NSData用来存储对象并初始化归档工具
  5. 创建归档工具
  6. 归档
  7. 结束归档
  8. 获取,拼接沙盒文件路径
  9. 写入

  • 解档
  1. 获取沙盒文件路径
  2. 创建NSData,并接收本地数据
  3. 创建解档工具,通过NSData
  4. 创建对象,并接收解档结果
  5. 结束解档
0 0