iOS开发常用知识点iOS开发iOS

iOS基础--沙盒-数据本地化-归解档-整理总结(1)

2016-06-23  本文已影响1078人  云之君兮鹏
惜春长怕花开早,何况落红无数!<圆陆鲨>

<h1>沙盒机制:</h1>

沙盒 : 每个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个<big>独立,封闭,安全</big>的空间 ,叫做沙盒 ,是一种安全体系.

注意:


查找某个应用的沙盒

第一种方式: 上图 点击左上面的 <big>前往</big>--> <big>按住Alt键</big> --><big>选中资源库</big> --> <big>选中Developer文件夹 </big> --> <big> CoreSimulator</big> --> <big>Devices</big> --> <big>模拟器路径</big>

第一步: 第二步:

第二种方式: 上图:


<h2>文件夹:</h2>

  • <u><h4>Documents</h4></u> :
    1: 存入一些永远不被删除的文件(不会被系统主动删除),itunes备份时,同时也会备份Documents文件(条件: 尽量不在Documents放入音频视频等太大的东西,只放一些重要文件,以免审核被拒) 注 :可以存,有方法让审核通过

获取文件夹方法:

NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSLog(@"%@",documentPathStr);

// 首先获取沙盒主路径的地址

NSString  *homePathStr = NSHomeDirectory();    NSLog(@"homePathStr = %@",homePathStr);```
// 其次: 在沙盒主路径后拼接Documents,拼接出来documents文件夹的路径
   ```code
 NSString *documentsPathStr = [homePathStr stringByAppendingPathComponent:@"Library/Caches"];
 NSLog(@"documents = %@",documentsPathStr);```
 //获取tmp文件夹得路径
 ```code
 NSString *tmpPathStr = NSTemporaryDirectory();
 NSLog(@"tmpPathStr = %@",tmpPathStr);

// 4.获取.app文件: 该目录包含了应用程序的本身的数据,包括资源文件和可执行文件,程序启动后会根据需求动态加载(懒加载)代码 或者 资源到内存中.而且整个目录是只读的. 不会被iTunes 同步

NSString *appPath = [[NSBundle mainBundle] resourcePath];
NSLog(@"appPath**右击打开包内容**%@",appPath);

简单对象的写入与读写

<u>数据本地化: 简单说就是把数据的,存储到应用程序的沙盒里面</u>

NSString  *documentsPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];    NSLog(@"%@",documentsPathStr);    ```
// 2 . 知道要存什么,  创建数据    
```code
NSString  *str = @"hello world";    ```
// 3 . 要知道数据放哪里 , 创建一个路径,路径的终点局势存数据的文件 Component(成分)    
```code
NSString  *strPath = [documentsPathStr stringByAppendingPathComponent:@"str.txt"];   ```
 // 4 . 写入操作    
```obj 
// 参数: atomically : YES 正当手机没电关机 会保存文件   
 //              NO   否    
// encoding : 编码方式    
[str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];```
   
-  读取

    // 通过路径读取数据,使用stringWithContentsOfFile方法,在读取的时候,
```obj
参数1: 表示读取文件的路径,
参数2: 表示编码格式,
参数3: 表示错误信息.
NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];```

-----------------------
![简单对象的写入读取方法](http:https://img.haomeiwen.com/i1523603/f812d1715e502db8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

------------------
NSData数据读取存储:
------------
题外话:
```obj 
UIImage *image1 = [UIImage imageNamed:<#(nonnull NSString *)#>]; 
UIImage *image2 = [UIImage alloc]initWithContentsOfFile:<#(nonnull NSString *)#>];````
- 根据imageName获取图片:会在缓存里存一份,下次在获取同名图片,直接从缓存里取.
 - 优点:快,只有第一次的时候慢,但是之后再获取的话会很快.   
 - 缺点:会浪费内存,如果只用致辞的话这块内存就浪费掉了.   
- 根据ContentsOfFile获取到的图片:每次都会根据路径去取图片,不会占用内存.如果图片只使用一次,推荐使用ContentsOfFile    

#####写入:
// 第一步: 获取路径

    NSString*documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
// 第二步: 创建一个UIimag的数据并转化成NSData类型的对象
```obj
     UIImage*image = [UIImage imageNamed:@"123"];
//将UIImage类型对象转化成NSData类型的
//第一个参数 :转哪个UIImage类型对象
//第二个参数:压缩系数,越小压缩越厉害
    NSData *data =UIImageJPEGRepresentation(image, 1); ```
// 第三步: 拼接出最终的存储地方
```obj
    NSString *stringPath = [documentPathStr stringByAppendingPathComponent:@"stringPath.txt" ];```
   
 // 第四步: 写入
```obj
[data  writeToFile:stringPath atomically:YES];```
    
####读取数据:
```obj
// 创建一个NSData类型数据 从文件中找到
NSData *newData = [NSData dataWithContentsOfFile:stringPath];
// 再转成UIImage
UIImage *newImage = [UIImage imageWithData:newData];

复杂对象的写入与读取:

复杂对象是指:

在Foundation框架内不存在的数据类,如自定义Person类等 无法在程序内通过writeToFile: 这个方法写入文件内 只能通过将负载对象转化为NSData,即归档


--------------------
归解档:
--------------------

举例建一个Person 类 有以下属性
// 如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议
```obj
@interface Person : NSObject<NSCoding>
@property(nonatomic,copy)NSString * name;
@property(nonatomic,copy)NSString *gender;
@property(nonatomic,assign)NSUInteger  age;```

实现协议方法:
```obj
//归档
//在归档和解档的时候,要把所有的属性都进行归解档
- (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= [super  init]) {
self.name= [aDecoder  decodeObjectForKey:@"name"];
self.gender= [aDecoder  decodeObjectForKey:@"gender"];
self.age= [aDecoder  decodeIntegerForKey:@"age"];}
returnself;
}

上代码:
// 如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议
// 建一个实例对象

Person *person = [[Person alloc]init]; 
person.name = @"James"; 
person.gender = @"M";
person.age = 38 ;

//第 2 步: 通过获取到的data 创建一个解档工具

  NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:newData];   

//第 3 步:创建一个Person对象,接收解档结果

   Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];   

//第 4 步:结束解档

  [keyedUnarchiver finishDecoding];    
  NSLog(@"%@",newPerson);      
  • 归解档是一种编码方式,不是数据本地化的方式

PS:下一篇在详细写点归解档

上一篇 下一篇

猜你喜欢

热点阅读