1,NSUserDefaults
是iOS系统提供的一个单例类(iOS提供了若干个单例类),通过类方法standardUserDefaults
可以获取NSUserDefaults
单例。如:NSUserDefaults *default = [NSUserDefaults standardUserDefaults];
(一般对于一些基本的用户设置,因为数据量很小,可以使用 NSUserDefaults类来进行处理。使用方法简单!)
2, NSUserDefaults
单例以key-value
的形式存储了一系列偏好设置,key
是名称,value
是相应的数据。
存数据时可以使用方法setObject:forKey:
来把对象存储到相应的plist
文件中;
取数据时可以使用方法objectForKey:
读取相应的plist
文件中的数据
3,数据对象存入plist
文件,那么对象的类型则必须是plist
文件可以存储的类型,
NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary
支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。即使对象是NSArray或NSDictionary,他们存储的类型也应该是以上范围包括的。
3.1. 举例子://###存:存一个整数、字符串和一张图片
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"jack“" forKey:@"firstName"];
[defaults setInteger:10 forKey:@"Age"];
UIImage *image =[UIImage imageNamed:@"somename"];
NSData *imageData = UIImageJPEGRepresentation(image, 100);//把image归档为NSData
[defaults setObject:imageData forKey:@"image"];
[defaults synchronize];
其中,方法synchronise
是为了强制存储,其实并非必要,因为这个方法会在系统中默认调用,但是你确认需要马上就存储,这样做是可行的。
注意事项:存储时,如果value
的值是"<null>",直接存到NSUserdefaults中,程序会崩溃掉。这个时候就要进行判断,如果传的值为"<null>",则变为@"";就可以存储了。
NSString *value = @"将要存储的信息";
NSString *object = ![value isEqual:
[NSNull null]] ? value:@"";
[[NSUserDefaults standardUserDefaults] setObject:object forKey:yourKey];
3.2. 举例子://###读:读一个整数、字符串和一张图片
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *firstName = [defaults objectForKey:@"firstName"];
NSInteger age = [defaults integerForKey:@"Age"];
NSData *imageData = [defaults dataForKey:@"image"];
UIImage *image = [UIImage imageWithData:imageData];
通过为三个数据设置key
的方式把NSInteger
、NSString
和UIImage
三种数据存储下来,其中图片是通过归档为NSData
的方式进行存储的,除此之外,还可以被转为NSNumber
或NSString
类型。顺便提一句,这里NSInteger
没有星号(*),因为NSInteger
根据系统是64位还是32位来判断自身是long
还是int
类型,并且它也不是一个标准Objective-C对象。
4, 简便方法存不同类型数据:
//存数据
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:@"admin"forKey:@"user_name"];
- setObject:forKey:
- setFloat:forKey:
- setDouble:forKey:
- setInteger:forKey:
- setBool:forKey:
- setURL:forKey:
UIImage *image =[UIImage imageNamed:@"somename"];
NSData *imageData = UIImageJPEGRepresentation(image, 100);
//把image归档为NSData
[userDefault setObject:imageData forKey:@"image"];
[userDefault synchronize];
//保存数据:保存UIcolor类型的,超出上面的5种数据类型,就要进行归档,把它们归档成data类型的数据之后再保存。
NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];
[[NSUserDefaults standardUserDefaults] setObject:objColor forKey:@"myColor"];
//读取数据:
//NSData *objColor = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
//UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];
5, 简便方法取不同类型数据:
//读数据
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault objectForKey:@"user_name"];
- objectForKey:
- URLForKey:
- arrayForKey:
- dictionaryForKey:
- stringForKey:
- stringArrayForKey:
- dataForKey:
- boolForKey:
- integerForKey:
- floatForKey:
- doubleForKey:
- dictionaryRepresentation
6,移除数据
[[NSUserDefaults standardUserDefaults] removeObjectForKey:KTreeFuncGuideIndex];
[[NSUserDefaults standardUserDefaults] synchronize];
7,立即写入 synchronize
NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:
[userDefault synchronize];
域的概念以及其用法
8,在NSUserDefault中存在域的概念,包含5个部分:
NSArgumentDomain,
Application,
NSGlobalDomain,
Languages,
NSRegistrationDomain。
NSArgumentDomain:
代表的是命令行参数,可以在Edit Scheme->Arguments->Arguments Passed On Launch中添加,格式是-key value。
Application:
应用程序域,设置的方法默认数据保存是在这里
NSGlobalDomain:
全局域,所有应用程序都将公用该域
Languages:
国际化语言版本域
NSRegistrationDomain:
临时域,- (void)registerDefaults:(NSDictionary*)registrationDictionary方法被调用是数据是保存在这里。
在读取数据时,都会在底层的存储结构中进行一次搜索,搜索的顺序是这样:
NSArgumentDomain->Application->NSGlobalDomain->Languages->NSRegistrationDomain
https://developer.apple.com/documentation/foundation/nsuserdefaults?language=objc