基本使用:
创建一个user defaults方法有多个,最简单得快速创建方法:
NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];
添加数据到 user defaults:
[accountDefaults setObject:nameField.text forKey:UserDefaultNameKey];
也可以添加基本数据类型int, float, bool等,有相应得方法
[accountDefaults setBool:YES forKey:UserDefaultBoolKey];
从user defaults中获取数据:
[accountDefaults objectForKey:NCUserDefaultNameKey]
[accountDefaults boolForKey: UserDefaultBoolKey];
要点:
NSUserDefaults非常好用,并不需要用户在程序中设置NSUserDefaults的全局变量,需要在哪里使NSUserDefaults的数据,那么就在哪里创建一个NSUserDefaults对象,然后进行读或者写操作。
针对同一个关键字对应的对象或者数据,可以对它进行重写,重写之后关键字就对应新的对象或者数据,旧的对象或者数据会被自动清理。
例子代码2:
代码基本如下:
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存储进去才可以
iPhone中在本地存储数据简单的说有三种方式:数据库、NSUserDefaults和文件。
NSUserDefaults用于存储数据量小的数据,例如用户配置。并不是所有的东西都能往里放的,只支持:NSString, NSNumber, NSDate, NSArray, NSDictionary,详细方法可以查看类文件。
NSUserDefaults读取和写入自定义对象
NSUserDefaults可以存取一些短小的信息。
比如存入再读出一个字符串到NSUserDefaults:
如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。不信可以试试,如果你成功的请告诉我。
那怎么办呢?
我找到的方法是,让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到 NSData中,再从NSUserDefaults中进行读取。
粘代码:
假设有这样一个简单的类对象
- @interface
BusinessCard : NSObject <NSCoding>{ -
NSString *_firstName; -
NSString *_lastName; - }
- @property
(nonatomic, retain) NSString *_firstName; - @property
(nonatomic, retain) NSString *_lastName; - @end;
-
- @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
然后再存取时通过NSData做载体:
- BusinessCard
*bc = [[BusinessCard alloc] init]; - NSUserDefaults
*ud = [NSUserDefaults standardUserDefaults]; - NSData
*udObject = [NSKeyedArchiver archivedDataWithRootObje ct:bc]; - [ud
setObject:udObject forKey:@"myBusinessCard"]; - [bc
release]; - udObject
= nil; - udObject
= [ud objectForKey:@"myBusinessCard"]; - bc
= [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ;