iOS 优化内存(八)持久化

iOS持久化

1.文件系统

不管是Mac OS X 还是iOS的文件系统都是建立在UNIX文件系统基础之上的。

1.1 沙盒模型

在iOS中,一个App的读写权限只局限于自己的沙盒目录中。

沙盒模型到底有哪些好处呢?

安全:别的App无法修改你的程序或数据

保护隐私:别的App无法读取你的程序和数据

方便删除:因为一个App所有产生的内容都在自己的沙盒中,所以删除App只需要将沙盒删除就可以彻底删除程序了

iOS App沙盒中的目录

  • App Bundle ,如xxx.app 其实是一个目录,里面有app本身的二进制数据以及资源文件
  • Documents, 存放程序产生的文档数据
  • Library , 下面默认包含下面两个目录 Caches Preferences
  • tmp, 临时文件目录

如果我们想在程序中获取上面某个目录的路径,应该如何实现呢? 下面就讲讲路径的获取, 通过NSPathUtilities.h中的NSSearchPathForDirectoriesInDomains函数,我们便可以获取我们想要的路 径。 此函数具体声明如下:

NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);

directory 目录类型 比如Documents目录 就是NSDocumentDirectory

domainMask 在iOS的程序中这个取NSUserDomainMask

expandTilde YES,表示将~展开成完整路径

注意函数返回的类型为数组,在iOS中一般这个数组中只包含一个元素,所以直接取lastObject即可。

1.2 NSFileManager

NSFileManager提供一个类方法获得一个单例。

  1. /* Returns the default singleton instance.*/ + (NSFileManager *)defaultManager;

下面罗列了NSFileManager的常用方法

  • 新建目录
  1. - (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;

createIntermediates这个参数一般为YES,表示如果目录路径中间的某个目录不存在则创建之,如果是NO的话,则要保证所创建目录的父目录都必须已经存在

  • 获取目录下的所有文件
  1. - (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;

如果目录为空,则返回空数组

  • 其他的一些方法
  1. - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error; - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error; - (BOOL)linkItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error; - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;

更多的可以查看文档 NSFileManager Class Reference

在实际项目中,我们一般会写一个工具类来负责项目中所有的路径操作。

2. 归档(Archives) 和 序列化(Serializations)

我们经常听到“序列化”,“反序列化”这样的字眼,其实“序列化”的意思就是将对象转换成字节流以便保存或传输,“反序列化”便是一个相反的过程,从字节流转到对象。

在这节中涉及到一种文件类型plist,plist就是Property List 的缩写,即所谓的属性列表,属性列表有两种数据格式,一种是XML的,方便阅读和编辑;另一种是二进制的,节省存储空间,以及提高效率。

在Objective-C中这个对象和字节流的互转分成两类:

  • 归档 普通自定义对象和字节流之间的转换
  • 序列化 某些特定类型(NSDictionary, NSArray, NSString, NSDate, NSNumber,NSData)的数据和字节流之间(通常将其保存为plist文件)的转换

不过本质上讲上述两种都是对象图(Object Graph)和字节流之间的转换. Apple关于序列化和归档的编程指南: Archives and Serializations
Programming Guide
 。

2.1 归档

如果我们需要将自定义的一个对象保存到文件,应该如何做呢?

这里引入两个东西:一个是NSCoding协议 ;另一个是NSKeyedArchiver,NSKeyedArchiver其实继承于NSCoder,可以以键值对的方式将对象的属性进行序列化和反序列化。

具体的过程可以这样描述 通过NSKeyedArchiver 可以将实现了NSCoding协议的对象 和 字节流 相互转换 。

像一些框架中的数据类型如NSDictionary,NSArray,NSString... 都已经实现了NSCoding协议,所以可以直接对他们进行归档操作。

这里来一个比较完整的例子,一个Address类,一个User类,User类下有个Address类型的属性。

Address类

User类

使用示例

通过查看文件内容可以发现,保存的是plist的二进制数据格式。 转成XML可以看到如下内容:

2.2 序列化

在实际的项目中,我们一般是将NSDictionary或NSArray的对象保存到文件或者从文件读取成对象。 当然这种只是适用于数据量不是很大的应用场景。 NSDictionary和NSArray 都有一个写入文件的方法

NSDictionary和NSArray会直接写成plist文件。

2.2.1 序列化的方式

序列化可以通过两种途径来进行

使用数据对象自带的方法

写文件

写完的文件内容如下:

现在 持久化数据用第三方的比较多!

时间: 2024-10-03 00:08:28

iOS 优化内存(八)持久化的相关文章

iOS优化内存方法推荐

1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露.它自动为你管理retain和release的过程,所以你就不必去手动干预了.忘掉代码段结尾的release简直像记得吃饭一样简单.而ARC会自动在底层为你做这些工作.除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存. 2. 在正确的地方使用 reuseIdentifier 一

iOS 优化内存(五)开发流程总结

iOS开发流程总结 流程:注册.开发.真机测试.发布以及上线. iPhone iOS 4从注册到app上线开发流程 一.关于注册账号IDP和Apple ID: 1.注册App ID(无论是iOS使用者还是开发者都需要*****ID,只是后者还需要付99$注册成为开发者.) 网址:http://developer.apple.com 由于上边的网址没有注册按钮,所以去iTunes注册,方法参照(这里注册的是免费的,您需要注册付费的): http://jingyan.baidu.com/articl

iOS 优化内存(四)何时用self

iOS何时使用self. 大多数的答案是:"这与objc的存取方法有关" 怎么样才能有关呢?接下来通过几个小例子来看一下. 首先我们创建一个学生类:Student类 这个学生类里有学生的id和学生的姓名name #import @interface Student : NSObject{ //idname NSString *id; NSString *name; } @property (nonatomic,strong) NSString *id; @property (nonat

iOS 优化内存(六)开发必不可少的75个工具

iOS 开发者必不可少的 75 个工具 如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断研究,同时了解一些替代品的使用,当你目前所用的工具无法满足你的需要时可以填补空缺. 记住了这些,我将向你展示一份关于各种工具的长长的列表.其中一些我每天都用,其他的我看情况使用.如果你还有更多的工具想展示在这个列表里,可以跟我留言哦亲. 我尽我所能给列表分分类

iOS 优化内存(三)iOS应用程序多语言本地化解决方案

iOS应用程序多语言本地化解决方案 最近要对一款游戏进行多语言本地化,在网上找了一些方案,加上自己的一点点想法整理出一套方案和大家分享! 多语言在应用程序中一般有两种做法: 一.程序中提供给用户自己选择的机会: 二.根据当前用户当前移动设备的语言自动将我们的app切换对应语言. 第一种做法比较简单完全靠自己的发挥了,这里主要讲第二种做法,主要分一下几点: 1.本地化应用程序名称 2.本地化字符串 3.本地化图片 4.本地化其他文件 1.本地化应用程序名称 (1)点击"new file"

iOS 优化内存(七)开发中使用第三方类库

在iOS中使用第三方类库 方法一:直接复制所有源文件到项目中 这种方法就是把第三方类库的所有源文件复制到项目中,直接把所有.h和.m文件拖到XCode项目中即可.如果第三方类库引用了一些系统自带类库,那么在项目中还需要额外引用那些类库. 如果当前的项目启用了ARC,而引用的第三方类库未使用ARC,那还需要在项目信息的Targets – Build Parses里找到第三方类库的.m文件,并为它们加上-fno-objc-arc标记. 而对于在未启用ARC的项目用引用使用了ARC的第三方类库,则需要

In-Memory:内存优化数据的持久化和还原

数据持久化是还原的前提,没有数据的持久化,就无法还原内存优化表的数据,SQL Server In-Memory OLTP的内存数据能够持久化存储,这意味着内存数据能够在SQL Server实例重启之后自动还原.在创建持久化的内存优化表时,必须设置选项:memory_optimized=on,durability=schema_and_data.内存优化表的持久化由两个进程实现:Checkpoint和事务日志记录,在服务器重启之后,SQL Server通过存储在磁盘上的事务日志和Checkpoin

iOS项目内存优化

在用非ARC模式编写iOS程序的时候,造成程序内存泄露在所难免,后期我们一般会进行内存优化.自己比较常用的内存优化方法有两种 1.Analyze,静态分析内存泄露的方法.很简单,在Xcode菜单栏中点击 ”Product“ -> "Analyze",编译完成后项目工程中可能造成内存泄露的代码就会被标记出来,这样我们就可以有针对性的更改代码优化内存了. 2.使用Xcode的自带工具Leaks,动态的检测内存泄露.一般步骤如下. 1>在Xcode菜单栏中点击 ”Product“

cocos2d 如何优化内存使用

如何优化内存使用 内存优化原理 为优化应用内存使用,开发人员首先应该知道什么最耗应用内存,答案就是纹理! 纹理几乎会占据90%应用内存.所以尽量最小化应用的纹理内存使用,否则应用很有可能会因为低内存而崩溃. 本文介绍Cocos2d-x游戏通用的两条内存优化原理指导. 认识瓶颈寻找方案 什么样的纹理最耗应用内存?或这些纹理会消耗多少内存?当然这个不用手动计算,只需猜测. 工具在这里已经准备好了.使用的是苹果的工具“Allocation & Leaks”.你可以在Xcode中长按“Run”命令,选择