iOS 数据持久化 NSUserDefault

摘要:
每个应用程序都有一个NSUserDefaults实例,可以通过向NSUserDefault类发送standardUserDefaults消息来获得该实例。NSUserDefaults实例类似于NSMutabbleDictionary。您可以通过键访问或删除对象。当应用程序首次使用NSUserDefaults实例时,NSUserDefault实例将自动从文件中读取数据;修改数据后,NSUserDefaults

每一个应用都有一个 NSUserDefaults 实例,向 NSUserDefaults 类发送 standardUserDefaults 消息可以得到该实例。

NSUserDefaults 实例类似与 NSMutableDictionary,可以通过键存取或删除该对象。

当应用第一次使用 NSUserDefaults 实例时,NSUserDefaults 实例会自动从文件读取数据;修改数据后,NSUserDefaults 实例会自动将数据写入文件。

NSUserDefaults 的键必须是字符串类型,一个键对应一个偏好设置,偏好设置的值是对象,而且是可序列化的(serializable)对象;也可以通过基本类型的数值存取偏好设置。

NSUserDefaults 的键都是字符串,并且存放和读取某个偏好设置时需要使用同一个键。

可以将这些字符串定义为静态变量或者“宏”,这样就可以将这些变量用做键,而不时写死的字符串,从而避免输入错误。

偏好设置的命名命名约定: 应用名+偏好设置名+单词PrefKey

列子一:

//
NSString *const projectFavnamePrefkey = @"projectFavnamePrefkey";
NSInteger i =0;
[[NSUserDefaults standardUserDefaults] setInteger:i forkey:projectFavnamePrefkey];

//
NSInteger j = [[NSUserDefaults standardUserDefaults] integerForKey:projectFavnamePrefkey];

要点:

NSUserDefaults非常好用,并不需要用户在程序中设置NSUserDefaults的全局变量,需要在哪里使NSUserDefaults的数据,那么就在哪里创建一个NSUserDefaults对象,然后进行读或者写操作。

针对同一个关键字对应的对象或者数据,可以对它进行重写,重写之后关键字就对应新的对象或者数据,旧的对象或者数据会被自动清理。

例子二:

NSArray* arr = [[NSArray alloc] initWithObjects:@"111", @"222",@"22223333",nil];
NSMutableArray* marr = [[NSMutableArray alloc] initWithArray:arr];
NSLog(@"%i",[arr count]);
NSLog(@"%i",[marr count]);
    
NSUserDefaults *mydefault = [NSUserDefaults standardUserDefaults];
[mydefault setObject:arr forKey:@"test1"];
[mydefault setObject:marr forKey:@"test2"];
[mydefault synchronize];  //保存到disk
    
NSArray* getarr=[mydefault objectForKey:@"test1"];
NSLog(@"test1=%i",[getarr count]);
NSArray* getmarr=[mydefault objectForKey:@"test2"];
NSLog(@"test2=%i",[getmarr count]);

注意一点:只能存储基本对象,如果是自定义的对象,需要转换成 NSData 存储进去才可以

iOS 本地存储数据简单的说有三种方式:数据库、NSUserDefaults和文件

NSUserDefaults用于存储数据量小的数据,例如用户配置。并不是所有的东西都能往里放的,只支持:NSString, NSNumber, NSDate, NSArray, NSDictionary,详细方法可以查看类文件

NSUserDefaults读取和写入自定义对象(转)

NSUserDefaults可以存取一些短小的信息。

比如存入再读出一个字符串到NSUserDefaults:

但是并不是所有的东西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。

那怎么办呢?

方法是,让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到 NSData中,再从NSUserDefaults中进行读取。

粘代码:

假设有这样一个简单的类对象

.h

@interface BusinessCard : NSObject <NSCoding>{  
    NSString *_firstName;  
    NSString *_lastName;  
}  
@property (nonatomic, retain) NSString *_firstName;  
@property (nonatomic, retain) NSString *_lastName;  
@end;  

.m

@implementation BusinessCard  
@synthesize _firstName, _lastName;  
- (void)dealloc{  
    [_firstName release];  
    [_lastName release];  
    [super dealloc];  
}  
- (id) initWithCoder: (NSCoder *)coder  
{  
    if (self = [super init])  
    {  
        self._firstName = [coder decodeObjectForKey:@"_firstName"];  
        self._lastName = [coder decodeObjectForKey:@"_lastName"];  
    }  
    return self;  
}  
- (void) encodeWithCoder: (NSCoder *)coder  
{  
    [coder encodeObject:_firstName forKey:@"_firstName"];  
    [coder encodeObject:_lastName forKey:@"_lastName"];  
      
}  
@end  

调用:

BusinessCard *bc = [[BusinessCard alloc] init];  
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];  
NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc];  
[ud setObject:udObject forKey:@"myBusinessCard"];  
[bc release];  
udObject = nil;  
udObject = [ud objectForKey:@"myBusinessCard"];  
bc = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ;   

免责声明:文章转载自《iOS 数据持久化 NSUserDefault》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇优化之zencart第一时间修改原始内容什么情况适合执行自动化测试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SDWebImage源码解析

但凡经过几年移动开发经验的人去大公司面试,都会有公司问到,使用过哪些第三方,看过他们的源码嘛?而SDWebImage就是经常被面试官和应聘者的提到的。下面将讲述SDWebImage的源码解析以及实现原理,希望可以帮助大家加深对SDWebImage实现原理的理解!!! 一、前言 SDWebImage专门用于iOS图片加载框架,提供了网络下载并缓存图片,通过使...

iOS https请求 NSURLSessionDataTask

// //  YKSHttpsRequest.m //  YKShareSdkDemo // //  Created by qingyun on 22/05/2017. //  Copyright © 2017 qingjoin. All rights reserved. // #import "YKSHttpsRequest.h" @implementa...

Java动手实验及课后程序

课后作业 一、编写程序,消息框显示计算结果 设计思想:导入Scanner包,使用JOptionPane类来实现消息框的输入和结果的显示。 程序代码: package com; import java.util.Scanner; //导入Scanner包 import javax.swing.JOptionPane; public class Manner ...

Kafka长文总结

Kafka是目前使用较多的消息队列,以高吞吐量得到广泛使用 特点: 1、同时为发布和订阅提供搞吞吐量。Kafka的设计目标是以时间复杂度为O(1)的方式提供消息持久化能力的,即使对TB级别以上数据也能保证常数时间的访问性能,即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输(一般消息处理是百万级,使用Partition实现机器间的并行处理)...

RocketMQ 4.x 介绍以及安装

Apache RocketMQ 是阿里开源的一款高性能、高吞吐量的分布式消息中间件. 官网:http://rocketmq.apache.org/ 特点 支持 Broker 和 Consumer 端消息过滤 支持发布订阅模型,和点对点, 支持拉 pull 和推 push 两种消息模式 单一队列百万消息、亿级消息堆积 支持单 master 节点,多 mas...

Hazelcast介绍

Hazelcast介绍 什么时侯需要用例 内存中分布式计算 场景分布式消息 特性 全景 Distributed Maps 一个结点中分区 Hazelcast中的分片也称为分区,Hazelcast默认271个分区。Hazlecast通常也会对分区备份,并将副本分布到集群的不同节点上,通过数据冗余提高可靠性,这种数据的存储方式和kafka...