你的位置:首页 > 操作系统

[操作系统]iOS进阶学习

一、沙盒机制

  1、什么是沙盒?

  • 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立、封闭、安全的空间,叫做沙盒。

  2、沙盒机制(SandBox)

  • 沙盒是一种安全体系。
  • 它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其它沙盒内的内容(iOS8之后已经部分开放访问)。
  • 所有的非代码文件都保存在这个地方,比如图片、声音、属性列表(plist)、sqlite数据库和文本文件等。

  3、沙盒机制的特点:

  • 每个应用程序的活动范围都限定在自己的沙盒里。
  • 不能随意跨越自己的沙盒去访问别的应用程序沙盒中的内容。
  • 应用程序向外请求或接收数据都需要经过权限认证。

  4、查找某个应用程序的沙盒有两种方式

  • 第一种:
  • 点击[前往]->同时按住Alt键->选中[资源库]->选中Developer文件夹->CoreSimulator->Devices->59DB5213FA4C4DACB3671326E0201C01->data->Containers->Data->Application->01EA9151E7BC4A19A39D38D61D4356A0
  • 红色字体的路径表示设备(模拟器)的路径
  • 蓝色字体的路径表示应用程序沙盒的路径
  • 代码实现(举例:获取Documents和Caches目录路径):
  // 地址是一个字符串  // 第一个参数是:枚举值,枚举你具体要查找的文件夹(要进入哪个文件夹直接修改其枚举值即可)  // NSDocumentDirectory:进去Document文件夹  // 第二个参数:NSUserDomainMask表示用户的主目录  // 第三个参数:一般设置为YES表示展示完整的路径  // NSSearchPathForDirectoriesInDomains 查找沙盒路径的,返回值是一个数组,这个数组里边只有一个元素,这个元素就是路径,直接使用下标取出即可  NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  NSLog(@"documentPath = %@", documentPath);    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];  NSLog(@"cachesPath = %@", cachesPath);

  • 第二种:
  • 应用程序的沙盒目录下会有三个文件夹Documents、Library(下面有Caches和Preferences目录)、tmp。
  • Documents:存储永远不会被删除的文件,会被iTunes同步,会备份到电脑上,如果需要可以从电脑中取出(在这个文件夹中不能存储过大的文件:如视频,音频,图片)【在程序退出的时候不会被删除,但是会被同步】。
  • Library:
  • Caches(缓存):这个文件夹的作用主要是用来缓存一些像视频、音频、图片这样的内容(SDWebImage缓存的图片就存在这个文件夹中)【在程序退出的时候不会被删除,也不会被同步】。
  • Preferences(偏好设置):保存应用程序的偏好设置,iTunes会自动备份此目录,这个目录中的内容会使用NSUserDefaults去取。
  • tmp:临时文件夹用来存取临时数据,临时数据是说删除就删除,在应用程序重启的时候都会被删除掉,不会被备份,iTunes也不会同步该目录。
  • 代码实现(获取Documents和Library目录路径):
  // 第一步:找到主目录文件夹  NSString *homePath = NSHomeDirectory();  NSLog(@"homePath = %@", homePath);    // 第二步:然后拼接自己想进入的路径  NSString *documentPathTwo = [homePath stringByAppendingPathComponent:@"Documents"];  NSLog(@"documentPathTwo = %@", documentPathTwo);    NSString *libraryPath = [homePath stringByAppendingPathComponent:@"Library"];  NSLog(@"libraryPath = %@", libraryPath);

  • tmp文件查找方式:
  NSString *temPath = NSTemporaryDirectory();  NSLog(@"tmp = %@", temPath);

二、简单对象的写入与读取

  1、iOS中提供4种简单对象类型可以直接进行文件存取:NSString(字符串)、NSArray(数组)、NSDictionary(字典)、NSData(数据)。包括他们的子类。

  2、简单对象的写入/读取:


    • 成功写入沙盒的文件:

      • 成功写入沙盒的图片:

      三、复杂对象的写入与读取

        1、复杂对象是指在Foundation框架内不存在的数据类,如自定义Person类无法再程序内通过writeToFile:这个方法写入到文件内。

        2、归档与反归档(解档)

      • 归档就是通过将复杂对象(自定义Person类型的对象)转换为NSData类型对象,即为复杂对象的本地化,这个对象必须遵守NSCoding协议,并实现协议中的两个方法。
      • 复杂对象->归档->NSData->writeToFile。
      • 反归档就是将NSData转换为复杂对象。
      • 读取文件->NSData->反归档->复杂对象。
      • 代码示例:
      @interface Person : NSObject<NSCoding>/// [email protected] (nonatomic, copy) NSString *name;/// [email protected] (nonatomic, copy) NSString *gender;/// [email protected] (nonatomic, assign) NSInteger age;@[email protected] Person// 归档// 将所有的属性进行归档- (void)encodeWithCoder:(NSCoder *)aCoder{  [aCoder encodeObject:self.name forKey:@"name"];  [aCoder encodeObject:self.gender forKey:@"gender"];  [aCoder encodeInteger:self.age forKey:@"age"];}// 反归档// 将所有属性进行反归档- (instancetype)initWithCoder:(NSCoder *)aDecoder{  self = [super init];  if (self) {    self.name = [aDecoder decodeObjectForKey:@"name"];    self.gender = [aDecoder decodeObjectForKey:@"gender"];    self.age = [aDecoder decodeIntegerForKey:@"age"];  }  return self;[email protected]

        // 1.找寻Documents文件夹的目录  NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  // 2.创建Person对象  Person *person = [[Person alloc] init];  person.name = @"MBBoy";  person.gender = @"man";  person.age = 25;  // 3.把这个复杂对象归档  // 3.1创建NSMutableData对象,用于初始化归档工具  NSMutableData *personData = [NSMutableData data];  // 3.2创建归档工具  NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:personData];  // 3.3对要归档的person对象进行归档  [archiver encodeObject:person forKey:@"person"];  // 3.4结束归档  [archiver finishEncoding];  // 4.将归档的内容存到本地  NSString *dataPath = [documentPath stringByAppendingPathComponent:@"person.plist"];  [personData writeToFile:dataPath atomically:YES];  NSLog(@"%@", dataPath);#pragma mark - 反归档  // 1.将要反归档的数据找出  NSData *resultData = [NSData dataWithContentsOfFile:dataPath];  // 2.创建解档工具  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];  // 3.对perosn对象进行解档  Person *newPerson = [unarchiver decodeObjectForKey:@"person"];  // 4.结束解档  [unarchiver finishDecoding];  NSLog(@"%@",newPerson.name);