iOS开发之属性列表

使用属性列表持久化数据对象非常方便,只要是数组或者字典中包含的对象是特定的可序列话对象(包括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、只能将一小部分存储在属性列表中,如果数据量比较大,则不适合采用。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值