NSUserDefaults和dispatch_once的注意点
来源:互联网 发布:网络主播好听的歌曲 编辑:程序博客网 时间:2024/06/05 02:42
今天在实现一个需求时,遇到了一些问题,记录如下。需求是这样的,要让一段代码在整个APP的生命周期内(这里的整个APP的生命周期是指app安装到卸载的时间内, 而不是程序的运行生命周期)只执行一次,我最先想到的是使用dispatch_once来实现,但很可惜,dispatch_once内的代码是在程序的运行生命周期内执行一次。验证如下:
static dispatch_once_t once; dispatch_once(&once , ^{ UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; view.backgroundColor = [UIColor redColor]; [self.view addSubview:view]; });
运行上述代码,会发现界面上会出现一个100x100的红方块,之后,同时按住shift+command键,然后双击H键,在模拟器后台里关闭APP,之后,从模拟器里启动APP(千万不要点Xcode的run按钮),发现红方块依然被构建了。因此,我得出结论dispatch_once内的代码是在程序的运行生命周期内执行一次。既然dispatch_once不行,那只能NSUserDefaults上场了,我个人不太喜欢使用NSUserDefaults,所以我一开始没打算用它。因为这东东和字典一个样,key值多的时候,鬼才记得哪个key存哪个value。解决这个问题的一种方法是给NSUserDefaults专门写一个文档,另一种方法是新建一个用户信息单例类,然后对里面的属性值进行归档(其实NSUserDefaults内部应该也是使用了这种机制),个人比较喜欢第二种方法,因为第二种的话可以给类添加方法,对该类的信息的操作都可以在这个类中完成,这里先埋个坑,以后给大家介绍如何使用第二种方法。废话说了这么多,现在来列几个注意点。对NSUserDefaults的使用,这里不做说明。的key,取出的值是null,如果是这样,那么取出的ss值,默认是NO:
//之前没有使用setValue:forKey方法赋值BOOL ss = [[NSUserDefaults standardUserDefaults] objectForKey:@"once"];
这样写好处是不用到处找初始化的位置了,比如上面的需求,可以直接判断:
if (![[NSUserDefaults standardUserDefaults] objectForKey:@"once"]) { /** * 做你想在整个APP生命里只做一次的事 */ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"once"]; [[NSUserDefaults standardUserDefaults] synchronize]; }
2:前往要记得,每次赋值后要调用“写方法(我是这么叫的)”,才能快速将内容写入文件,不然,没有这句代码的话,写入操作会有延迟,具体看开发文档。
[[NSUserDefaults standardUserDefaults] synchronize];
1 0
- NSUserDefaults和dispatch_once的注意点
- 使用dispatch_once写单例注意
- dispatch_once和@synchronized的单例模式
- sscanf的使用技巧和注意点
- 连锁加盟的要点和注意点
- 自定义的信号和槽注意点
- Session的一些操作和注意点
- 【笔记】linklist和PullToRefreshListView的注意点
- UIWindow的一些基本概念和注意点
- css的一些总结和注意点
- inline和override的注意点
- ArrayList 的用法和注意点
- z-index的用法和注意点
- json和el表达式的注意点
- NSUserDefaults的应用和特点
- NSUserDefaults的应用和特点
- NSUserDefaults的应用和特点
- 面试注意点和面试官最关注的点
- LeetCode Find the Duplicate Number
- iOS开发见闻-第6期
- 系统自带的UIBarButtonSystemItem样式
- Hello, world!
- 面向对象程序设计上机练习二(函数模板)
- NSUserDefaults和dispatch_once的注意点
- 黑马程序员-Java中比较实用的对象总结
- 面向对象程序设计上机练习三(有默认参数的函数)
- 一键解决从Myeclipse工程打包JavaWeb项目到服务器的Tomcat,并自动部署
- hdu1406 完数 (预处理,求x的因子和)
- 面向对象程序设计上机练习四(变量引用)
- sqlite 的使用方法
- 图片的加载ImageLoader
- Camera 360使用之坑