iOS开发之属性列表

来源:互联网 发布:政府高官子女知乎 编辑:程序博客网 时间:2024/06/01 09:44

使用属性列表持久化数据对象非常方便,只要是数组或者字典中包含的对象是特定的可序列话对象(包括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>


创建getFilePath方法,用于获取属性列表的保存路径。

<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、只能将一小部分存储在属性列表中,如果数据量比较大,则不适合采用。






0 0
原创粉丝点击