一、基本概念
1、之前如果我们想要实现一个对象支持整个应用程序访问,需要自己创建一个单例对象,而其实iOS系统内部给我们提供了这个一个单例类,NSUserDefaults,用来保存一些整个应用程序都能访问到的数据
2、保存到NSUserDefaults对象的内容都被放在沙盒Library/Oreferences文件夹中
3、对这个NSUserDefaults对象进行操作,就相当于对文件进行操作
4、NSUserDefaults对象的存取方式和字典类似
二、用法
1、通过单例方法找到NSUserDefault对象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
2、用NSUserDefault对象存储数据,因为数据最终是存放在plist文件中,所以在这里可以存储plist里面支持的数据类型,存取方式和字典类似
[defaults setInteger:12 forKey:@"age"];
3、用NSUserDefault对象取数据
[defaults integerForKey:@"age"];
4、用NSUserDefault对象移除偏好设置里面的数据
[defaults removeObjectForKey:nil];
三、宏定义与NSUserDefault的搭配使用
1、存值
#define kSaveMyDefault(A,B) [[NSUserDefaults standardUserDefaults] setObject:B forKey:A]
2、取值
#define kFetchMyDefault(A) [[NSUserDefaults standardUserDefaults] objectForKey:A]
四、练习
1、应用第一次启动有新手教程
1) 打开模拟本地缓存的工程
2)创建继承与UIViewController的控制器FirstLaunchViewController,用来做欢迎界面,.m文件如下
#import "FirstLaunchViewController.h"
#import "AppDelegate.h"
@interface FirstLaunchViewController ()
@end
@implementation FirstLaunchViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UILabel *welcomeLabel = [[UILabel alloc]initWithFrame:self.view.frame];
welcomeLabel.text = @"欢迎您";
welcomeLabel.font = [UIFont boldSystemFontOfSize:20];
welcomeLabel.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:welcomeLabel];
}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{
//获取到应用程序的appDelegate
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
//在AppDelegate方法内给重新设置window的主窗口
[appDelegate setWindowRootVC];
}
@end
3)AppDelegate.h
#import
@interface AppDelegate : UIResponder
@property (strong, nonatomic) UIWindow *window;
//声明一个用来切换window主窗口的window
- (void)setWindowRootVC;
@end
4) 修改AppDelegate.m的内容如下
#import "AppDelegate.h"
#import "ViewController.h"
#import "FirstLaunchViewController.h"
//通过宏定义让偏好设置存取值
#define kSaveMyDefault(A,B) [[NSUserDefaults standardUserDefaults] setObject:B forKey:A]
#define kFetchMyDefault(A) [[NSUserDefaults standardUserDefaults] objectForKey:A]
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
//设置window的根控制器
[self setWindowRootVC];
return YES;
}
- (void)setWindowRootVC{
//判断之前是否启动过
if (kFetchMyDefault(@"isFirst") == nil) {
//如果没有启动过就给键isFirst赋值
kSaveMyDefault(@"isFirst", @1);
FirstLaunchViewController *firstLaunchVC = [[FirstLaunchViewController alloc]init];
self.window.rootViewController = firstLaunchVC;
}else {
self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc]init]];
}
}
@end