天天看点

iPhone开发之使用NSUserDefaults存储数据

之前做数据持久化,发现NSUserDefaults还是挺好用的,然后就写一些经验之谈

NSUserDefaults用于存储数据量小的数据,例如用户配置。并不是所有的东西都能往里放的,

只支持:NSString, NSNumber, NSDate, NSArray, NSDictionary

存放于一个plist文件中。这个文件位于在 app同级目录的/Library/Preferences目录下

其实 NSUserDefaults主要就是setObject和objectForKey差不多就够了,要有多复杂的数据需要存储就直接用其他的方法好了;

此外,还有个什么registerDefaults方法,也不是很需要的样子

注意点:UserDefaults不是立即写入,而是根据时间戳定时的把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题。可以通过调用synchornize方法强制写入。

 代码如下:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:@"111" forKey:@"myTest"];

[defaults synchronize];

NSString *testStr = [defaults objectForKey:@"myTest"];

NSLog(@"testStr is: %@",testStr);

=================分隔线,上面这些差不多够了,下面的只是个例子===========================

//方法1:在需要使用到的地方写入下列代码即可,无需导入任何文件

//存数据

NSUserDefaults *appDefault =[NSUserDefaultsstandardUserDefaults];

[appDefault setObject:@"123" forKey:@"one"]; 

// saving an NSInteger    [appDefault setInteger:42 forKey:@"integerKey"];

// saving a Double          [appDefault setDouble:3.1415 forKey:@"doubleKey"];

// saving a Float             [appDefault setFloat:1.2345678 forKey:@"floatKey"];

//读数据 

NSUserDefaults *appDefault =[NSUserDefaultsstandardUserDefaults]; 

NSLog(@"qq%@",[appDefault objectForKey:@"one"]);

// getting an NSStringNSString *myString = [appDefault stringForKey:@"keyToLookupString"];

// getting an NSIntegerNSInteger myInt = [appDefaultintegerForKey:@"integerKey"];

// getting an Floatfloat myFloat = [appDefault floatForKey:@"floatKey"];

//方法2:全局定义,即不用每个使用到的地方都写 NSUserDefaults *appDefault =[NSUserDefaultsstandardUserDefaults]; 语句

//AppDelegate.h文件中添加

#define appDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])

@property (assign, nonatomic)NSUserDefaults *appDefault;

//AppDelegate.m文件中添加

@synthesize appDefault;

appDelegate.appDefault = [NSUserDefaults standardUserDefaults];

//顺带初始化下

[appDelegate.appDefault setObject:NULL forKey:@"one"];

然后在任意使用的地方添加:

//存数据

  [appDelegate.appDefault setObject:@"122333" forKey:@"one"];

//读数据

[appDelegate.appDefault objectForKey:@"one"]

还有一个好的方法来存储你的当前实例的全局变量

再建立一个类,专用来存放你的全局的变量,这样可以分得更清楚

特别是数据相对较多,较复杂的情况

用专用的类来存储你的全局数据,是更好的办法