使用属性列表持久化数据对象非常方便,只要是数组或者字典中包含的对象是特定的可序列话对象(包括NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就可以直接通过NSDictionary和NSArray的实例方法将其保存到属性列表或者从属性列表中读取他们。
下面通过一个简单的例子来展示一下属性列表的用法。实现在程序退出之前把数据保存到属性列表,下次启动时,重新从属性列表中加载这些数据。
1、创建Persistence项目
使用single view application模版创建一个项目,命名为Persistence。打开Main.storyboard,构建如下视图。包括4个标签和4个文本字段。
2、编辑ViewController类
将4个文本字段关联到输出口集合。
<span style="font-size:14px;">#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic, strong) IBOutletCollection(UITextField)NSArray * lineFields;
@end</span>
<span style="font-size:14px;">- (NSString *)getFilePath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentDirectory = paths[0];
NSString * dataPath = [documentDirectory stringByAppendingPathComponent:@"textFeildText.plist"];
return dataPath;
}</span>
然后编辑viewDidLoad方法,程序启动时,从属性列表获取数据。
<span style="font-size:14px;">- (void)viewDidLoad
{
[super viewDidLoad];
/*判断当前路径下文件是否存在*/
if ([[NSFileManager defaultManager] fileExistsAtPath:[self getFilePath]]) {
/*如果存在,用该文件的内容实例化数组*/
NSArray * textArray = [NSArray arrayWithContentsOfFile:[self getFilePath]];
for (int i =0; i<4; i++) {
UITextField * textField = self.lineFields[i];
textField.text = textArray[i];
}
}
/*注册通知*/
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:nil];
}</span>
最后来看看applicationWillResignActive方法里面做了什么。
<span style="font-size:14px;">- (void)applicationWillResignActive:(NSNotification *)notification
{
NSArray * textArray = [self.lineFields valueForKey:@"text"];
[textArray writeToFile:[self getFilePath] atomically:YES];
}</span>
因为我们在viewDidLoad方法中注册了相应的通知,所以一旦应用程序进入后台,此方法将会被调用。此方法很简单,首先将4个文本字段中包含的内容添加到一个数组中。然后通过调用数组的writeToFile方法,将数据保存到属性列表。在这里解释一下writeToFile方法的两个参数,第一个参数比较清楚,指定数据的存储路径,在这里我们还是把它存储在指定的document目录下。主要时第二个参数atomically,如果设置为YES,则表示将数据先写入一个辅助文件,而不是直接下入到指定目录,成功写入到辅助文件之后,辅助文件将被复制到指定目录下。这是一个安全的写入文件的方法,因为如果一旦写入文件的过程中程序发生崩溃,现有的文件不会被破坏导致数据丢失,尽管这增加了一点点开销,但是还是值得的。
运行程序,分别在4个文本字段中输入文字,然后按home键使它进入后台,重新启动程序,发现4个文本框重新加载了上次输入的文本。
属性列表非常方便、实用。但是有两个缺点:
1、只适用于特定的系统默认支持可序列化的对象
2、只能将一小部分存储在属性列表中,如果数据量比较大,则不适合采用。