沙盒目录介绍

  • Documents
    • 保存由应用程序产生的文件或者数据,例如:涂鸦程序生成的图片,游戏关卡记录
    • iCloud 会自动备份 Document 中的所有文件
    • 如果保存了从网络下载的文件,在上架审批的时候,会被拒!
  • tmp
    • 临时文件夹,保存临时文件
    • 保存在 tmp 文件夹中的文件,系统会自动回收,譬如磁盘空间紧张或者重新启动手机
    • 程序员不需要管 tmp 文件夹中的释放
  • Caches
    • 缓存,保存从网络下载的文件,后续仍然需要继续使用,例如:网络下载的离线数据,图片,视频…
    • 缓存目录中的文件系统不会自动删除,可以做离线访问!
    • 要求程序必需提供一个完善的清除缓存目录的”解决方案”!
  • Preferences
    • 系统偏好,用户偏好
    • 操作是通过 [NSUserDefaults standardDefaults] 来直接操作

iOS 不同版本间沙盒目录的变化

  • iOS 7.0及以前版本 bundle 目录和沙盒目录是在一起的
  • iOS 8.0之后,bundle 目录和沙盒目录是分开的

NSString+Path

  1. #import "NSString+Path.h"
  2. @implementation NSString (Path)
  3. - (NSString *)appendDocumentPath {
  4. NSString *dir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
  5. return [dir stringByAppendingPathComponent:self.lastPathComponent];
  6. }
  7. - (NSString *)appendCachePath {
  8. NSString *dir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
  9. return [dir stringByAppendingPathComponent:self.lastPathComponent];
  10. }
  11. - (NSString *)appendTempPath {
  12. return [NSTemporaryDirectory() stringByAppendingPathComponent:self.lastPathComponent];
  13. }
  14. @end

沙盒缓存

  • 将图像保存至沙盒
  1. if (data != nil) {
  2. [data writeToFile:app.icon.appendCachePath atomically:true];
  3. }
  • 检查沙盒缓存
  1. // 判断沙盒文件是否存在
  2. UIImage *image = [UIImage imageWithContentsOfFile:app.icon.appendCachePath];
  3. if (image != nil) {
  4. NSLog(@"从沙盒加载图像 ... %@", app.name);
  5. // 将图像添加至图像缓存
  6. [self.imageCache setObject:image forKey:app.icon];
  7. cell.iconView.image = image;
  8. return cell;
  9. }

iOS6 的适配问题

面试题:iOS 6.0 的程序直接运行在 iOS 7.0 的系统中,通常会出现什么问题

  • 状态栏高度 20 个点是不包含在 view.frame 中的,self.view 的左上角原点的坐标位置是从状态栏下方开始计算
    • iOS 6.0 程序直接在 iOS 7.0 的系统中运行最常见的问题,就是少了20个点
  • 如果包含有 UINavigationControllerself.view的左上角坐标原点从状态栏下方开始计算
    • 因此,iOS 6.0的系统无法实现表格从导航条下方穿透的效果
  • 如果包含有 UITabBarControllerself.view的底部不包含 TabBar
    • 因此,iOS 6.0的系统无法实现表格从 TabBar 下方穿透效果