NSUserDefaults类概述
NSUserDefaults类为和默认的系统进行交互提供了一个系统编程接口。默认的系统允许一个应用来定制它的行为以适应用户的喜好。例如,你可以允许用户去决定你的应用程序显示什么样的计量单位或者文件多少时间自动保存。应用程序在用户默认的数据库里分配记录的参数值。这些参数被作为默认值,因为他们通常用于确定一个用用程序在启动时的默认状态或者默认状态的作用方式。
在运行时,你可以使用NSUserDefaults对象读取你的应用程序的从一个用户默认数据库使用的默认数据。NSUerDefaults缓存信息,以避免每次获取一个默认值都需要打开用户默认的数据库。同步方法,他会每隔一段时间自动调用,使内存中缓存的信息与用户默认数据库中的信息同步。
NSUserDefaults类为访问普通类型的变量提供便利的方法,这些类型有floats,doubles,integers,booleans和URLs。一个默认的对象必须是一个属性列表,是NSData,NSString,NSNumber,NSDate,NSArray或者NSDictionary的实例。如果你想存储其它类型的对象,你应当将其转换成一个NSData的实例。
从NSUserDefaults返回的值都是不可变的。即使你设置了一个可变的值。例如,你设置了一个可变的字符串作为“MyStringDefault”的值,你用stringForKey:获取到的字符串将是不可变的。
默认数据库是为用户自动创建的。NSUserDefaults目前不支持per-host的偏好(设置)。要做到这一点,你必须使用CFPreferences API.然而,NSUserDefaults正确的读取per-host的偏好,所以你可以安全地混合CFPreferences与NSUserDefaults的代码。
如果你的应用程序支持管理的环境,你可以使用一个NSUserDefaults对象去决定哪些对用户有利的喜好是由管理员管理的。受管理的环境中对应的计算机实验室或教室管理员或教师肯能需要以一种特定的方式配置系统。在这种情况下,教师会建立一组默认的偏好设置并且强制对用户使用。如果以这种方式管理偏好设置,应用程序应该防止用户编辑,禁用任何适当的控制。
NSUserDefaults类是线程安全的。
NSURL的持久性和文件引用的URLs
当使用NSURL实例参考文件内的过程中,重要的是要基于位置的跟踪与文件系统的身份跟踪之间的区别。当坚持一个NSURL,你应该考虑采取这种行为。如果你的应用程序跟踪位于其身份的资源,那么当用户移动文件的时候你可以发觉到,那么你应该明确的解NSURL的书签数据或者对文件引用的URL进行编码。
如果你想通过文件的引用跟踪文件,但是当解析时你需要显式控制,你需要关心的把书签数据写到NSUserDefaults中,而不是依靠[NSUserDefaults setURL:forKey:],当你知道你的应用程序将能够处理潜在的I/O所需的用户界面交互时允许你调用[NSURL
URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:]
沙盒注意事项
一个沙盒应用不能访问和修改其他应用的偏好设置。例如,如果你使用addSuiteNamed:方法添加另一个应用程序,但是你不会获得该应用程序的偏好设置。
尝试去访问或者修改另一个应用的偏好设置不会导致错误,但是当你你做的时候,世纪上OS X读取和写入位于应用程序容器内的文件,而不是其他应用程序的偏好设置文件。
方法详解
获取公有的NSUserDefaults实例
[plain] view plaincopy
+ (NSUserDefaults *)standardUserDefaults;
单例模式,获取NSUserDefaults的一个实例,默认Key值如下:
AppleLanguages,
AppleKeyboardsExpanded,
AppleITunesStoreItemKinds,
AppleLocale,
AppleKeyboards,
NSLanguages,
NSInterfaceStyle
[plain] view plaincopy
+ (void)resetStandardUserDefaults;
初始化一个NSUserDefaults的对象
[plain] view plaincopy
- (id)init;
- (id)initWithUser:(NSString *)username;
init是初始化一个公有的defaults对象
initWithUser是初始化一个针对username的对象
注册一个defaults
[plain] view plaincopy
- (void)registerDefaults:(NSDictionary *)registrationDictionary;
注册的内容(registrationDictionary里的)不写入磁盘
获取Defaults的值
[plain] view plaincopy
- (NSArray *)arrayForKey:(NSString *)defaultName;
[plain] view plaincopy
- (BOOL)boolForKey:(NSString *)defaultName;
返回一个和defaultName关联的bool值,如果不存在defaultName的话返回NO
[plain] view plaincopy
- (NSData *)dataForKey:(NSString *)defaultName
返回defaultName所对应的NSData数据,如果defaultName不存在或者返回的数据不是NSData类型的都会返回nil
返回的数据是不可变类型的
[plain] view plaincopy
- (NSDictionary *)dictionaryForKey:(NSString *)defaultName
同dataForKey
[plain] view plaincopy
- (float)floatForKey:(NSString *)defaultName
同dataForKey
如果defaultName不存在返回0
[plain] view plaincopy
- (NSInteger)integerForKey:(NSString *)defaultName
同floatForKey
如果defaultName不存在返回0
[plain] view plaincopy
- (id)objectForKey:(NSString *)defaultName
同dataForKey
[plain] view plaincopy
- (NSArray *)stringArrayForKey:(NSString *)defaultName
同dataForKey
如果defaultName不存在,或者defaultName所对应的不是一个数组,或者数组包含的不是NSString对象都会返回nil
[plain] view plaincopy
- (NSString *)stringForKey:(NSString *)defaultName
同dataForKey
[plain] view plaincopy
- (double)doubleForKey:(NSString *)defaultName
同floatForKey
[plain] view plaincopy
- (NSURL *)URLForKey:(NSString *)defaultName
同dataForKey
当调用[NSUserDefaults URLForKey:]时,有以下3种情况:
1.如果值是NSData,NSData可以作为[NSKeyedUnarchiver unarchiveObjectWithData:]的参数。如果NSData可以作为NSURL存档就返回一个NSURL,否则返回nil
2.如果值是一个文件引用的URL,那么这个文件引用的URL将会被创建,但是它的书签数据不会被解决直到以后使用NSURL实例
3.如果值是一个一~开头的字符串,这个字符串将会用[NSString stringByExpandingTildeInPath]扩展,文件将会以NSURL创建
设置Defaults值
[plain] view plaincopy
– setBool:forKey:
– setFloat:forKey:
– setInteger:forKey:
– setDouble:forKey:
– setObject:forKey:
对象参数只能是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray,NSDictionary
– setURL:forKey:
移除Defaults值
[plain] view plaincopy
- (void)removeObjectForKey:(NSString *)defaultName
维护持久域
[plain] view plaincopy
- (BOOL)synchronize
把持久域中的任何改变写到磁盘并且更新磁盘上的任何没有修改的持久域
如果返回YES表明成功保存到磁盘,相反返回NO
这个方法是以一定周期间隔自动调用的,如果你不想等待自动调用就可以调用这个方法来同步。(例如,如果你的应用要退出时,或者你想更新磁盘上的defaults即使你没有做任何改变)
[plain] view plaincopy
- (NSDictionary *)persistentDomainForName:(NSString *)domainName
返回一个特定持久域的键值对
[plain] view plaincopy
- (NSArray *)persistentDomainNames
返回当前的持久域的名称
[plain] view plaincopy
- (void)removePersistentDomainForName:(NSString *)domainName
移除对应domainName的持久域
[plain] view plaincopy
- (void)setPersistentDomain:(NSDictionary *)domain forName:(NSString *)domainName
设置持久域
domainName
This value should be equal to your application"s bundle identifier.
访问管理的环境值
[plain] view plaincopy
- (BOOL)objectIsForcedForKey:(NSString *)key
- (BOOL)objectIsForcedForKey:(NSString *)key inDomain:(NSString *)domain
管理搜索列表
[plain] view plaincopy
- (NSDictionary *)dictionaryRepresentation
返回搜索列表中对应域的所有的键值对
维护不稳定的域
[plain] view plaincopy
– removeVolatileDomainForName:
– setVolatileDomain:forName:
– volatileDomainForName:
– volatileDomainNames
维护套件
[plain] view plaincopy
- (void)addSuiteNamed:(NSString *)suiteName
一个套件可以在不同的应用之间使用
[plain] view plaincopy
- (void)removeSuiteNamed:(NSString *)suiteName
移除套件
<翻译水平有限,还请海涵~~>
NSUserDefaults类用于保存应用程序设置和属性以及用户数据。例如,你可以存储用户在应用程序中使用的图片或默认颜色方案。这些对象存储在iOS所谓的“defaults系统”中。iOS的defaults系统在整个app中都是可用的,因此存放到defaults系统中的数据也是整个应用程序生命周期中可用的。也就是说,无论用户关闭程序还是关机,在用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:
NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary
如果你想保存其他类型,如UIImage,你应该进行编码(即archive),或者将它转换为NSData、NSNumber或者NSString。
写入一个字符串:
// 保存数据
[[NSUserDefaults standardUserDefaults] setObject:@"string"
forKey:@"name"];
// 用synchronize方法把数据持久化到standardUserDefaults数据库
[[NSUserDefaults standardUserDefaults] synchronize];
读取字符串:
NSString *userName = [[NSUserDefaults standardUserDefaults]
objectForKey:@"name"];NSUserDefaults:除了可以读取、写入一些基本类型外,还可以读取、写入类的对象。
NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。下次再登陆的时候就可以直接从
NSUserDefaults里面读取上次登陆的信息咯。因为如果使用自己建立的plist文件什么的,还得自己显示创建文件,读取文件,很麻烦,而是用NSUserDefaults则不用管这些东西,就像读
字符串一样,直接读取就可以了。
(1)NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型。很实用吧。
(2)NSUserDefaults写的设置数据都会保存在Library/Preferences目录下的一个plist文件中。需要注意的是如果程序意外退出,[NSUserDefaults standardUserDefaults]数据不会被系统写入到该文件,所以,要使用[[NSUserDefaultsstandardUserDefaults] synchronize]命令直接同步到文件里,来避免数据的丢失。
//NSNumber
NSNumber*num1=[NSNumbernumberWithLong:1234567890];
[[NSUserDefaultsstandardUserDefaults]setObject:num1forKey:@"testNum"];
NSLog(@"Num:%@",[[NSUserDefaultsstandardUserDefaults]objectForKey:@"testNum"]);// Num:1234567890
//字符串
NSString*nameStr=@"wangchan1992";
[[NSUserDefaultsstandardUserDefaults]setObject:nameStrforKey:@"testStr"];
//这里建议同步存储到磁盘中,但是不是必须的.
[[NSUserDefaultsstandardUserDefaults] synchronize];
NSLog(@"Str:%@",[[NSUserDefaultsstandardUserDefaults] objectForKey:@"testStr"]);//Str:wangchan1992
//字典
NSDictionary*dict=@{@"A":@"90~100",@"B":@"80~89",@"C":@"70~79"};
[[NSUserDefaultsstandardUserDefaults] setObject:dictforKey:@"testDic"];
NSLog(@"Dic:%@",[[NSUserDefaultsstandardUserDefaults]objectForKey:@"testDic"]);
/*
Dic:{
A = "90~100";
B = "80~89";
C = "70~79";
}
*/
//数组
NSArray*array=@[@"Aa",@"Ba",@"Cc",@"Dd",@"Ee",@"Ff",@"Gg"];
[[NSUserDefaultsstandardUserDefaults]setObject:arrayforKey:@"testArr"];
NSLog(@"Arr:%@",[[NSUserDefaultsstandardUserDefaults]objectForKey:@"testArr"]);//
/*
Arr:(
Aa,
Ba,
Cc,
Dd,
Ee,
Ff,
Gg
)
*/
//数组里存放字典
NSDictionary*dict0=@{@"dict0":@"aa",@"dict1":@"bb"};
NSDictionary*dict1=@{@"dict0":@"aa",@"dict1":@"bb"};
NSDictionary*dict2=@{@"dict0":@"aa",@"dict1":@"bb"};
NSMutableArray*muArr=[NSMutableArrayarrayWithObjects:dict0,dict1,dict2, nil];
[[NSUserDefaultsstandardUserDefaults]setObject:muArrforKey:@"testMuArr"];
NSLog(@"muArr:%@",[[NSUserDefaultsstandardUserDefaults]objectForKey:@"testMuArr"]);
/*
muArr:(
{
dict0 = aa;
dict1 = bb;
},
{
dict0 = aa;
dict1 = bb;
},
{
dict0 = aa;
dict1 = bb;
}
)
*/
https://m.shanpow.com/dl/449203/
推荐访问: