关于使用NSUserDefaults心得
iOS开发培训教程浅析NSUTF8StringEncoding

iOS开发培训教程浅析NSUTF8StringEncoding学习iOS的同学在处理字符串里经常要用到NSUTF8StringEncoding,我们一直这样写却从来不知道NSUTF8StringEncoding到底是什么东东,这是因为你们很幸运,也许你一辈子都不需要知道NSUTF8StringEncoding是什么。
如果不幸有一天你被相关的乱码问题所困扰,那你可能就需要对其有所了解了。
这里Vincent带你简单认识一下NSUTF8StringEncoding,这里Vincent力求通俗易懂,不追求严谨。
故事得从计算机发明那天开始说起,大家都知道计算机是美国人发明的,而计算机是二进制的其内部只有0和1。
如果只是做一些数学计算也没什么,为了能让计算机做更多的事情(比如处理文字)总得能把常见用的符号录入计算机吧。
所以美国人就想用一定位数的二进制数表示各种符号。
大家知道英文只有26个字母,大小写加起来是52个,再加上0到9十个数字是62,再加上+-*/及各种见见的标点符号总共也才百才来个字符,用7位二进制表示就足够了,所以美国人制定了一个字符编码标准ASCII(America Standard Code for Information Interchange 美国标准信息交换代码)。
这对美国人来说基本够用了,事情就这样定下来了。
可是随着时间的推移出问题了,搞数学的人想用计算机处理希腊字母,法国和意大利等欧洲国家的文字里也有一些特殊符号需要计算机处理。
索性就把ASCII从7位扩展到了8位,一下子表示256个字符了。
好在欧州国家的字符比较少,事情解决了。
随着计算机在全世界的普及新的问题又出现了,很多国家都有自己的文字,比如中文成千上万,一个字节(8位)怎么也不够用了,所以人们就想用两个或者多字节表示一个字符。
这一时期出现了各种编码方式虽然在一定程度上解决了字符(文字)编码问题,但因没有对全世界所有的文字统一编码也造成了各种问题,那就是乱码。
nsuserdefaults使用详解 简书

1. 什么是NSUserDefaults?NSUserDefaults是iOS开发中的一种用户偏好设置存储方式,使用键值对的形式存储数据。
它主要用于存储应用程序的配置信息和用户的偏好设置。
2. NSUserDefaults的使用方法2.1 创建NSUserDefaults对象使用NSUserDefaults时,首先需要获取到NSUserDefaults对象。
可以通过调用[NSUserDefaults standardUserDefaults]方法来获取一个单例对象。
```objective-cNSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];```2.2 存储数据存储数据时,可以使用setObject:forKey:方法,将需要存储的数据以键值对的形式保存到NSUserDefaults中。
```objective-c[defaults setObject:"value" forKey:"key"];```2.3 读取数据读取数据时,可以使用objectForKey:方法,通过指定键值来获取存储在NSUserDefaults中的数据。
```objective-cNSString *value = [defaults objectForKey:"key"];```3. NSUserDefaults的数据类型NSUserDefaults支持存储的数据类型包括:NSString、NSNumber、NSData、NSDate、NSArray、NSDictionary、BOOL、NSInteger、float等基本数据类型。
4. NSUserDefaults的存储原理NSUserDefaults将数据存储在一个plist文件中,该文件位于应用的Library/Preferences目录下。
swiperefreshlayout原理解析

swiperefreshlayout原理解析【SwipeRefreshLayout原理解析】SwipeRefreshLayout是Android中一个常用的控件,能够实现下拉刷新的功能。
它的原理是通过对用户的手势操作进行监听,当用户向下滑动并达到一定的距离后,便触发下拉刷新的动作。
下面将对SwipeRefreshLayout的原理进行详细的解析。
一、手势监听SwipeRefreshLayout通过对用户的手势操作进行监听来实现下拉刷新的功能。
Android提供了GestureDetector类来实现手势监听,它能够监听用户的滑动、点击、长按等手势操作。
在SwipeRefreshLayout中,通过重写onTouchEvent方法来监听用户滑动的手势操作。
当用户按下手指时,会触发MotionEvent.ACTION_DOWN事件;当用户滑动时,则会触发MotionEvent.ACTION_MOVE事件;当用户释放手指时,则会触发MotionEvent.ACTION_UP事件。
二、下拉刷新触发条件当用户向下滑动时,SwipeRefreshLayout通过判断滑动距离是否超过一定阈值,来确定是否触发下拉刷新的动作。
具体的判断条件可以通过setDistanceToTriggerSync方法来设置,默认值为SwipeRefreshLayout.DEFAULT_DISTANCE_TO_TRIGGER_SYNC,即64dp。
在onTouchEvent方法中,当监听到用户滑动事件时,会调用startDragging 方法进行滑动距离的判断。
如果滑动距离超过设定的阈值,则会通过setRefreshing方法来设置下拉刷新的状态,并调用onRefresh方法来处理下拉刷新的逻辑。
三、下拉刷新状态变化SwipeRefreshLayout中定义了两个状态:NORMAL(普通状态)和REFRESHING(正在刷新状态)。
深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

深入理解iPhone数据持久化(手把手教你iphone开发–基础篇)33 次阅读, iOS入门, iOS开发文档, 移动开发入门, by flysolo.在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中。
symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录。
在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解。
iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表、对象归档、嵌入式数据库(SQLite3)、其他方法。
一、属性列表NSUserDefaultsNSUserDefaults类的使用和NSKey edArchiver有很多类似之处,但是查看NSUserDefaults的定义可以看出,NSUserDefaults直接继承自NSObject而NSKeyedArchiver 继承自NSCoder。
这意味着NSKeyedArchiver实际上是个归档持久化的类,也就可以使用NSCoder类的[encodeObject: (id)objv forKey:(NSString *)key]方法来对数据进行持久化存储。
1 2 3 4 5 6 7 8 91011121314151617181920212223242526 -(void)applicationDidFinishLaunching:(UIApplication *)application {NSString *strOne = @"Persistent data1";NSString *strTwo = @"Persistent data 2";NSMutableArray *persistentArray =[[NSMutableArray alloc] init]; [persistentArray addObject:strOne];[persistentArray addObject:strTwo];//archiveNSUserDefaults *persistentDefaults =[NSUserDefaults standardUserDefaults]; [persistentDefaults setObject:persistentArray forKey:@"myDefault"];NSString *descriptionDefault =[persistentDefaults description];NSLog(@"NSUserDefaults description is :%@",descriptionDefault);//unarchiveNSArray *UnpersistentArray =[persistentDefaults objectForKey:@"myDefault"];NSString *UnstrOne =[UnpersistentArray objectAtIndex:0];NSString *UnstrTwo =[UnpersistentArray objectAtIndex:1];NSLog(@"UnstrOne = %@,UnstrTwo = %@",UnstrOne,UnstrTwo);// Override point for customization after application launch[window makeKeyAndVisible];}二、对象归档NSKeyedArchiver和NSKeyedUnarchiveriPhone和symbian 3rd一样,会为每一个应用程序生成一个私有目录,这个目录位于/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications下,并随即生成一个数字字母串作为目录名,在每一次应用程序启动时,这个字母数字串都是不同于上一次的,上一次的应用程序目录信息被转换成名为.DS_Store隐藏文件,这个目录的文件结构如下图:通常使用Documents目录进行数据持久化的保存,而这个Documents目录可以通过NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserdomainMask,YES)得到,代码如下:1 2 3 4 5 6 7 -(void)applicationDidFinishLaunching:(UIApplication *)application {NSString *strOne = @"Persistent data1";NSString *strTwo = @"Persistent data 2";NSArray *persistentArray =[NSArray arrayWithObjects:strOne,strTwo,nil];NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSAllDomainsMask, YES);8910111213141516171819202122232425262728293031 int pathLen =[pathArray count];NSLog(@"path number is :%d",pathLen);NSString *filePath;for(int i =0; i < pathLen; i++){filePath =[pathArray objectAtIndex:i];NSLog(@"%d path is :%@",i,filePath);}NSString *myFilename =[filePath stringByAppendingPathComponent:@"myFile.rtf"]; NSLog(@"myfile's path is :%@",myFilename);// no files generated in correspond directory now[NSKey edArchiver archiveRootObject:persistentArray toFile:myFilename];// now the myFile.rtf is generated// Override point for customization after application launch[window makeKeyAndVisible];}NSSearchPathForDirectoriesInDomains()的第二个参数是个枚举值,在笔者的测试代码中,只有NSUserDomainMask和NSAllDomainsMask可以获取到目录数为1,其余的皆为0,打印出来的结果如下:[Session started at 2009-11-10 21:30:08 +0800.]2009-11-10 21:30:10.516 PersistentExample[763:207] path number is :12009-11-10 21:30:10.518 PersistentExample[763:207] 0 path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/C93DC783-F137-4660-AE5A-08C3E11C774B/Documents2009-11-10 21:30:10.521 PersistentExample[763:207] myfile’s path is :/Users/sund fsun2009/Library/Application Support/iPhone Simulator/User/Applications/C93DC783-F137-4660-AE5A-08C3E11C774B/Documents/myFile.rtf Terminating in response to SpringBoard’s termination.[Session started at 2009-11-10 21:32:27 +0800.]2009-11-10 21:32:30.091 PersistentExample[803:207] path number is :12009-11-10 21:32:30.092 PersistentExample[803:207] 0 path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/763E6772-E754-452F-8532-80C2CE4466B5/Documents2009-11-10 21:32:30.100 PersistentExample[803:207] myfile’s path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/763E6772-E754-452F-8532-80C2CE4466B5/Documents/myFile.rtf Terminating in response to SpringBoard’s termination.从打印的结果如下,每次应用程序启动时生成的数字字母串目录名字并不一样。
vue心得体会

vue心得体会作为一名前端开发者,在接触 Vue 框架的这段时间里,我深深感受到了它带来的便利和创新。
Vue 以其简洁、高效和灵活的特点,迅速成为了前端开发领域的热门选择。
在这里,我想分享一下我在使用Vue 过程中的一些心得体会。
Vue 的核心概念非常清晰易懂,其中最让我印象深刻的就是组件化开发。
在传统的前端开发中,代码的组织和管理往往比较混乱,尤其是当项目规模逐渐增大时,维护起来就会变得异常困难。
而 Vue 的组件化思想将页面拆分成一个个独立的、可复用的组件,每个组件都有自己的模板、逻辑和样式。
这不仅使得代码结构更加清晰,而且大大提高了开发效率。
比如,我们可以将一个常见的导航栏封装成一个组件,在需要的地方直接引用,而无需重复编写相同的代码。
另外,Vue 的数据驱动视图的理念也给我带来了很大的启发。
在Vue 中,我们只需要关注数据的变化,而无需手动操作 DOM 来更新页面。
当数据发生改变时,Vue 会自动重新渲染相关的视图,这种机制使得开发过程更加高效和简洁。
同时,Vue 还提供了丰富的指令,如vif、vfor 等,使得我们能够更加方便地控制视图的显示和遍历数据。
在使用 Vue 的过程中,我也深刻体会到了它良好的生态系统带来的优势。
Vue 拥有大量优秀的第三方插件和库,比如 Vue Router 用于实现路由管理,Vuex 用于状态管理等。
这些插件和库极大地丰富了 Vue 的功能,使得我们能够更加轻松地构建复杂的应用程序。
在实际开发中,我发现 Vue 的模板语法非常简洁直观。
它采用了类似于 HTML 的语法结构,使得开发者能够快速上手。
同时,Vue 还支持在模板中使用 JavaScript 表达式,这为我们在模板中进行一些简单的逻辑处理提供了很大的便利。
然而,使用 Vue 也并非一帆风顺。
在刚开始学习的时候,对于组件之间的通信方式理解得不够透彻,导致在开发过程中出现了一些问题。
比如,父子组件之间的通信可以通过 props 和$emit 来实现,而兄弟组件之间的通信则需要借助于事件总线或者 Vuex 来完成。
nsuserdefaults用法

nsuserdefaults用法## How to use NSUserDefaults.NSUserDefaults is a singleton class that provides a way to store key-value pairs in the user's defaults database. The user's defaults database is a persistent store that survives app restarts and upgrades.NSUserDefaults can be used to store any type of data, including strings, numbers, arrays, and dictionaries. To store a value, you use the `setValue:forKey:` method. To retrieve a value, you use the `valueForKey:` method.NSUserDefaults also provides a number of convenience methods for working with common types of data. For example, the `integerForKey:` method can be used to retrieve an integer value, and the `boolForKey:` method can be used to retrieve a boolean value.NSUserDefaults can be used to store any type of datathat you need to persist between app launches. For example, you could use NSUserDefaults to store the user's preferences, or to store the state of a game.### Example.The following example shows how to store and retrieve a string value using NSUserDefaults:swift.// Store a string value.UserDefaults.standard.setValue("Hello, world!", forKey: "greeting")。
[[nsuserdefaults standarduserdefaults] 写入数组 -回复
![[[nsuserdefaults standarduserdefaults] 写入数组 -回复](https://img.taocdn.com/s3/m/4efe66795627a5e9856a561252d380eb629423a9.png)
[[nsuserdefaults standarduserdefaults] 写入数组-回复如何使用NSUserDefaults标准用户设置来将一个数组写入iOS应用程序。
第一步:了解NSUserDefaults和数据存储NSUserDefaults是iOS开发中一个常用的工具,用于存储和检索应用程序的用户设置和其他持久化数据。
它使用键值对的形式来保存数据,并可以很容易地从应用程序的任何位置进行访问。
在我们深入了解如何将数组写入NSUserDefaults之前,我们需要对数据存储的概念有一个基本的了解。
iOS提供了几种存储数据的选项,包括NSUserDefaults、Core Data和SQLite等。
每种方法都有其适用的场景和特点。
在这篇文章中,我们将专注于使用NSUserDefaults来存储和检索一个数组。
第二步:创建一个数组在使用NSUserDefaults来存储数组之前,我们需要先创建一个数组。
我们可以使用Objective-C语言的NSArray类来创建并操作数组。
例如,以下代码将创建一个名为"myArray"的数组,并向其中添加三个字符串元素:NSArray *myArray = ["Apple", "Banana", "Orange"];这是一个简单的数组示例,你可以根据自己的需求进行修改和扩展。
第三步:使用NSUserDefaults存储数组一旦我们有了一个数组,我们就可以使用NSUserDefaults将其存储在应用程序中。
接下来,让我们来看一下具体的代码:获取NSUserDefaults实例NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];使用setObject方法将数组存储至NSUserDefaults[defaults setObject:myArray forKey:"myArrayKey"];立即同步数据[defaults synchronize];在上面的代码中,我们首先获取了NSUserDefaults的实例,这个实例被命名为"defaults"。
nsuserdefaults 存储空值处理

在iOS开发中,我们经常会用到NSUserDefaults来存储和读取用户的偏好设置。
但在使用过程中,我们有时会遇到一些关于存储空值的处理问题。
本文将就nsuserdefaults存储空值处理进行探讨和总结。
为了更好地理解nsuserdefaults存储空值处理的问题,首先我们需要了解NSUserDefaults的基本用法。
NSUserDefaults是iOS中用于存储用户偏好设置和应用程序配置信息的持久化存储类。
它以键值对的形式进行存储和读取,并且在应用程序的整个生命周期中都可以访问。
在使用NSUserDefaults时,我们首先需要获取一个NSUserDefaults实例,并利用其提供的方法进行存储和读取操作。
那么,当我们要存储一个空值时,该如何处理呢?通常来说,我们可以直接通过removeObjectForKey方法将特定键对应的数值从NSUserDefaults中移除。
这样就可以达到存储空值的效果,而不会在用户偏好设置中留下无用的数值。
但需要注意的是,在某些情况下,我们也可以考虑将空值替换为特定的默认值,以便在读取时能够保持更好的兼容性和稳定性。
接下来,让我们深入探讨如何处理nsuserdefaults存储空值的具体方法。
一种常见的做法是在进行写入操作时,先进行判断键对应的数值是否为空,如果为空则执行移除操作;而在读取操作时,则可以设置默认值来保证代码的健壮性。
这样可以有效避免因空值导致的不必要问题,同时也能提高代码的可靠性和稳定性。
我们还可以采用一些其他的处理方式来应对nsuserdefaults存储空值的问题。
可以在存储之前对数值进行判空处理,以确保不会存储空值;或者在读取时进行空值判断,以保证程序逻辑的正确性。
这些方法都可以有效地解决因空值而引起的各种潜在问题,从而提高应用程序的质量和稳定性。
对于nsuserdefaults存储空值的处理,我们应该始终关注代码的健壮性和稳定性。
在写入时,要注意对空值进行处理,避免将无效的数值存储到用户偏好设置中;在读取时,要考虑设置默认值,以应对可能的空值情况。
NSUserDefaults的用法

NSUserDefaults的用法Property List (属性表)定义:Property List文件是一种用来存储序列化后的对象的文件。
属性列表文件的文件扩展名为.plist,因此通常被称为 plist 文件。
pl是一种格式,包含了(NSData,NSString,NSNumber,NSDate,NSArray,NSDictionary 这六种任意组合创建的结构体)。
NSUserDafults相当于一个缓存,而plist是一个文件。
NSUserDefault,它其实也是以property list 的形式来存储的,但是它有限制,比如说NSColor和NSFont等类型式不能够直接存储的,我们必须要转换他们,要把他们转换成NSData类型来存。
总结一下就是说,plist 文件和NSUserDefaults都是存储文件的一种方法。
至于plist怎么储存,等要用的时候再来补充,先了解。
NSUserDefaults定义:1. NSUserDefaults类用于保存应用程序设置和属性以及用户数据。
例如,你可以存储用户在应用程序中使用的图片或默认颜色方案,或者背景等。
这些对象存储在iOS所谓的“defaults系统”中。
2. iOS的defaults系统在整个app中都是可用的,因此存放到defaults系统中的数据也是整个应用程序生命周期中可用的。
也就是说,无论用户关闭程序还是关机,在用户再次打开程序或开机后这些数据仍然存在。
3. 从NSUserDefaults返回的值是不可改变的,即便是你在存储的时候使用的是可变的值。
例如你使用mutable string做为“MyStringDefault”的值,当你做使用stringForKey:方法获取的值,这个值仍然是不可变的。
4. NSUserDefaults是单例,同时也是线程安全的5. NSUserDefaults可以存储的数据类型只能是property list类型的数据。
[[nsuserdefaults standarduserdefaults] 写入数组 -回复
![[[nsuserdefaults standarduserdefaults] 写入数组 -回复](https://img.taocdn.com/s3/m/41d76370a22d7375a417866fb84ae45c3a35c26c.png)
[[nsuserdefaults standarduserdefaults] 写入数组-回复如何使用NSUserDefaults标准用户默认设置(standardUserDefaults)来将一个数组写入到应用程序中。
第一步:了解NSUserDefaultNSUserDefault是iOS中一个用于存储应用程序的持久数据的类。
它可以在应用程序关闭后保持数据的状态,并将其加载回来。
NSUserDefault是一种轻量级的数据存储方式,适用于存储一些简单的数据,比如字符串、整数、布尔值、浮点数以及数组。
第二步:导入头文件在需要使用NSUserDefault的文件中,首先要导入头文件。
我们可以使用import语句导入“NSUserDefaults.h”头文件。
第三步:创建一个数组在将数组写入NSUserDefault之前,我们需要先创建一个数组。
可以使用NSMutableArray类来创建一个可变数组,如下所示:NSMutableArray *myArray = [[NSMutableArray alloc]init];第四步:向数组中添加数据接下来,我们可以通过使用addObject方法将数据添加到我们的数组中。
例如,向数组中添加整数:[myArray addObject:@10];第五步:将数组写入NSUserDefault一旦我们的数组填充完毕,就可以开始将它写入NSUserDefault。
首先,我们需要获取NSUserDefault的实例(单例模式):NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];接下来,我们可以使用setObject:forKey:方法来将我们的数组写入NSUserDefault。
我们可以使用一个键来标识它,以便后续检索。
在这个例子中,我们将使用“myArray”作为键名:[defaults setObject:myArray forKey:@"myArray"];第六步:同步数据最后一步是在写入数据之后同步数据。
[[nsuserdefaults standarduserdefaults] 写入数组 -回复
![[[nsuserdefaults standarduserdefaults] 写入数组 -回复](https://img.taocdn.com/s3/m/2ae1b29727fff705cc1755270722192e44365858.png)
[[nsuserdefaults standarduserdefaults] 写入数组-回复下面我们来详细解析*[[NSUserDefaults standardUserDefaults]写入数组]*。
在iOS 开发当中,NSUserDefaults 可以帮助我们将应用程序的一些小设置、轻量数据保存在本地,以便下次启动应用程序同样可以使用这些数据。
NSUserDefaults 是一个小型的键值存储,以用户关键字存储用户数据,它可以快速读写我们保存到程序的设置以及选项。
可以将NSUserDefaults简单理解为一个存储数据的容器,在其中存储数据并且使用时会自动同步到磁盘上。
NSUserDefaults 可以通过键值对的方式进行读取和保存数据,而我们想要将多个值作为一组数据在应用程序中进行保存和读取时,这就需要借助*UserDefaults 写入数组* 来实现。
下面简单介绍一下*[[NSUserDefaults standardUserDefaults]写入数组]* 的步骤:1. 创建数组:在进行*UserDefaults 写入数组* 之前,首先我们需要创建一个待写入的数组。
以下是示例代码:objective-cNSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects:"Monday","Tuesday","Wednesday","Thursday","Fri day","Saturday","Sunday", nil];2. 获取NSUserDefaults 实例:接下来我们需要获取NSUserDefaults 的实例,以供我们将数据保存到本地。
示例代码如下:objective-cNSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];3. 将数据存入NSUserDefaults:接着我们需要调用NSUserDefaults 的setObject:forKey: 方法将我们创建的dataArray 数组保存到本地。
[[nsuserdefaults standarduserdefaults] 写入数组
![[[nsuserdefaults standarduserdefaults] 写入数组](https://img.taocdn.com/s3/m/86c81ebbc9d376eeaeaad1f34693daef5ff71315.png)
[[nsuserdefaults standarduserdefaults] 写入数组1.引言1.1 概述概述部分的内容可以从以下几个方面来进行描述:1. NSUserDefaults作为iOS中的一个轻量级的数据存储方案,主要用于保存和获取应用程序的用户偏好设置和其他小型数据。
2. NSUserDefaults提供了一种简单的方式来存储常用的数据类型,如NSString、NSNumber、NSArray、NSDictionary等。
3. NSUserDefaults提供了方便的API来读取和写入数据,无需手动进行文件操作。
4. NSUserDefaults使用plist文件作为底层数据存储,实际上是将数据保存在应用程序的沙盒中的一个特定的目录下。
5. 使用[[NSUserDefaults standardUserDefaults]方法来获取NSUserDefaults的单例对象,只需在应用程序中的任何地方调用该方法即可。
6. NSUserDefaults不适用于存储大量或敏感的数据,其主要用途是存储简单的用户配置和偏好设置。
通过以上几点,读者可以初步了解到NSUserDefaults的概念和作用,为后续的内容展开打下基础。
接下来,将会介绍NSUserDefaults的使用方法,以帮助读者更好地理解和应用该功能。
文章结构部分主要是对整篇文章的结构进行介绍和概述。
下面是对1.2文章结构的内容编写:1.2 文章结构在本文中,将会详细介绍[[NSUserDefaults standardUserDefaults]] 的使用方法以及其在写入数组时的应用。
文章主要分为以下几个部分:1. 引言1.1 概述在这一部分,将介绍本文的主题和背景,解释为什么我们需要了解[[NSUserDefaults standardUserDefaults]]以及其在数组写入中的应用。
1.2 文章结构(当前部分)这一部分将对文章的整体结构进行介绍,让读者能够清楚地了解本文的组织框架和各部分内容。
IOS使用NSUserDefault去实现界面传值和数据存储

IOS使⽤NSUserDefault去实现界⾯传值和数据存储IOS使⽤NSUserDefault去实现界⾯传值和数据存储系统单例NSUserDefault的传值第⼀界⾯中SecondViewController *secondvc = [SecondViewController new];//创建系统单例 NSUserDefaults的实例对象NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];//存值[defaults setObject:_firsttextfield.text forKey:@"firstTGP"];NSLog(@"%@",defaults);[self.navigationController pushViewController:secondvc animated:YES];第⼆界⾯中//创建对象来获取存好的数据NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];//接收数据NSString *str = [defaults objectForKey:@"firstTGP"];//赋值到控件_secondlabel.text = str;说到单例,这⾥先说⼀下⾃⼰重写的单例传值的⽅法.⾃⼰重写单例类⽅法,实现两个页⾯传值,都是给定的死值.重写单例的原因,是希望在程序的运⾏期间,他在内存中⼀直存在,可以随时读取数据⾸先创建单例类(DataHandle),两种⽅法#pragma mark---第⼀种⽅法://创建单例⽅法使⽤加号的原因:在创建之前⽆法存在⼀个实例对象去调⽤+(instancetype)sharedDatahandle{//为了线程安全(添加线程锁)@synchronized(self) {if (!dataHandle) {dataHandle = [[DataHandle alloc]init];}}return dataHandle;}#pragma mark---第⼆种⽅法:+(instancetype)sharedDatahandle{static DataHandle *dataHandle = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{dataHandle = [[DataHandle alloc]init];});return dataHandle;}就从后往前传举例,其实从前往后传是同样的道理第⼆页⾯中self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back" style:UIBarButtonItemStylePlain target:self action:@selector(backAC)];DataHandle *handle = [DataHandle sharedDatahandle];handle.title = @"年薪";- (void)backAC{[self.navigationController popViewControllerAnimated:YES];}第⼀页⾯- (void)viewWillAppear:(BOOL)animated{//从后往前传时的取值操作//取值(同样不能写在ViewDidLoad中)DataHandle *handle = [DataHandle sharedDatahandle];self.firstLabel.text = handle.title;}嘿嘿,有点跑题了,下边继续说NSUserDefault,接着说NSUserDefault的数据存储在使⽤NSUserDefault⾃定义对象的最初,必须知道可以存哪些类型的数据1:NSNumber(NSInteger,float,double)2:NSString,NSArray,NSDictionary,BOOL//使⽤NSUserDefault进⾏存储//1:创建要存储的数组NSArray *array = @[@"11", @"22",@"33"];//创建NSUserDefault对象NSUserDefaults *user = [NSUserDefaults standardUserDefaults];[user setObject:array forKey:@"userArray"];NSLog(@"%@",user);//读取NSArray *newarr = [user objectForKey:@"userArray"];NSLog(@"%@",newarr);#warning 注意:对相同的Key赋值约等于⼀次覆盖,要保证每⼀个Key的唯⼀性// NSUserDefaults 存储的对象全是不可变的(这⼀点⾮常关键,弄错的话程序会出bug),例如,如果我想要存储⼀个 NSMutableArray 对象,我必须先创建⼀个不可变数组(NSArray)再将它存⼊NSUserDefaults中去NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234",@"456", nil];NSArray *array1 = [NSArray arrayWithArray:mutableArray];NSUserDefaults *user2 = [NSUserDefaults standardUserDefaults];[user2 setObject:array1 forKey:@"我们这⾥存放的⼀定是不可变的"];// 取出数据是⼀样的,想要⽤NSUserDefaults中的数据给可变数组赋值/*-------------- 错误⽅法 --------------*/// NSMutableArray *mutablearray = [user objectForKey:@"我们这⾥存放的⼀定是不可变的"];// //这样写后,mutableArray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug// NSLog(@"%@",mutablearray);/*------ 正确 --------*/NSMutableArray *mutablearray = [NSMutableArray arrayWithArray:[user2 objectForKey:@"我们这⾥存放的⼀定是不可变的"]]; NSLog(@"%@",mutablearray);感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
NSUserDefaults保存对象数组报错

NSUserDefaults保存对象数组报错在使⽤NSUserDefaults的时候插⼊数据有时候会报以下错误:Attempt to set a non-property-list objec这种错误的原因是插⼊了不识别的数据类型,NSUserDefaults⽀持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型。
解决办法把数组归档之后再进⾏存储直接上代码模型数据的代码#import <Foundation/Foundation.h>@interface itemModel : NSObject@property(nonatomic,copy)NSString* name;@property(nonatomic,copy)NSString* number;- (instancetype)initWithDict:(NSDictionary *)dict;+ (instancetype)appInfoWithDict:(NSDictionary *)dict;+ (NSArray *)appinfoArrayWithArray:(NSArray *)array;@end#import"itemModel.h"@interface itemModel ()@end@implementation itemModel- (instancetype)initWithDict:(NSDictionary *)dict{self = [super init];if (self) {[self setValuesForKeysWithDictionary:dict];}return self;}+ (instancetype)appInfoWithDict:(NSDictionary *)dict{return [[self alloc] initWithDict:dict];}-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}+ (NSArray *)appinfoArrayWithArray:(NSArray *)arr{NSMutableArray *arrayM = [NSMutableArray array];for (NSDictionary *dict in arr) {[arrayM addObject:[self appInfoWithDict:dict]];}return arrayM;}-(void)encodeWithCoder:(NSCoder *)aCoder{[aCoder encodeObject:_name forKey:@"name"];[aCoder encodeObject:_number forKey:@"number"];}- (id)initWithCoder:(NSCoder*)aDecoder{if (self = [super init]) {_name = [aDecoder decodeObjectForKey:@"name"];_number = [aDecoder decodeObjectForKey:@"number"];}return self;}@end使⽤⽅法//解档获得数组NSData * data= [[NSUserDefaults standardUserDefaults]objectForKey:@"key"];NSArray * appArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];NSMutableArray * mut = [NSMutableArray arrayWithArray:appArray];[mut addObject:mode];//归档存储数组NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:[mut mutableCopy]]; [userDefaults setObject:data1 forKey:@"key"];[userDefaults synchronize];。
NSUserDefault使用

NSUserDefault的使用NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等。
默认系统允许应用程序自定义它的行为去迎合用户的喜好。
你可以在程序运行的时候从用户默认的数据库中读取程序的设置。
同时NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。
可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步。
NSUserDefaults是单例,同时也是线程安全的。
NSUserDefaults类提供了非常方便的方法来获取常用的类型,例如 floats,doubles,intergers,Booleans,URLs。
所以一个NSUserDefaults的对象必须是属性表,这也就是说 我们可以存储NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary 这些实例。
注意:(1)如果你想存储其他类 型的对象,你要将其归档并创建一个NSData来实现存储。
(2)从NSUserDefaults返回的值是不可改变的,即便是你在存储的时候使用的是可变的值。
例如你使用mutable string做为“MyStringDefault”的值,当你做使用stringForKey:方法获取的值,这个值仍然是不可变的。
常用方法创建实例:NSUserDefaults *userDefault = [NSUserDefaults s tandardUserDefaults];保存信息:[userDefault s etObject:@"YES" f orKey:@"login"];同步信息:[userDefault s ynchronize];查找信息:[userDefault o bjectForKey:@"login"];删除信息:[userDefault r emoveObjectForKey:@"login"];删除全部:方法1 删除指定的从用户的默认持久域的内容NSString *userDefaultApp = [[NSBundle m ainBundle] b undleIdentifier];[userDefault r emovePersistentDomainForName:userDefaultApp];方法2 删除设备上所有的NSUserDefaults的设置NSDictionary *dicts = [userDefault d ictionaryRepresentation];for (id k ey i n d icts){[userDefault r emoveObjectForKey:key];}[userDefault s ynchronize];获取全部:NSDictionary *dicts = [userDefault d ictionaryRepresentation];其他事项存储:Nsuserdefaults保存的文件应用程序内置的一个plist文件里。
NSUserDefaults详解

NSUserDefaults详解NSUserDefaults类概述NSUserDefaults类为和默认的系统进行交互提供了一个系统编程接口。
默认的系统允许一个应用来定制它的行为以适应用户的喜好。
例如,你可以允许用户去决定你的应用程序显示什么样的计量单位或者文件多少时间自动保存。
应用程序在用户默认的数据库里分配记录的参数值。
这些参数被作为默认值,因为他们通常用于确定一个用用程序在启动时的默认状态或者默认状态的作用方式。
在运行时,你可以使用NSUserDefaults对象读取你的应用程序的从一个用户默认数据库使用的默认数据。
NSUerDefaults缓存信息,以避免每次获取一个默认值都需要打开用户默认的数据库。
同步方法,他会每隔一段时间自动调用,使内存中缓存的信息与用户默认数据库中的信息同步。
NSUserDefaults类为访问普通类型的变量提供便利的方法,这些类型有floats,doubles,integers,booleans和URLs。
一个默认的对象必须是一个属性列表,是NSData,NSString,NSNumber,NSDate,NSArray或者NSDictionary 的实例。
如果你想存储其它类型的对象,你应当将其转换成一个NSData的实例。
从NSUserDefaults返回的值都是不可变的。
即使你设置了一个可变的值。
例如,你设置了一个可变的字符串作为“MyStringDefault”的值,你用stringForKey:获取到的字符串将是不可变的。
默认数据库是为用户自动创建的。
NSUserDefaults目前不支持per-host的偏好(设置)。
要做到这一点,你必须使用CFPreferences API.然而,NSUserDefaults正确的读取per-host的偏好,所以你可以安全地混合CFPreferences与NSUserDefaults的代码。
如果你的应用程序支持管理的环境,你可以使用一个NSUserDefaults对象去决定哪些对用户有利的喜好是由管理员管理的。
使用NSUserDefaults存储自定义对象

一、了解NSUserDefaults以及它可以直接存储的类型NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。
使用NSUserDefaults 存储自定义对象的最初,我们必须认识NSUserDefaults可以存储哪一些类型的数据,下面一一列出:NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.如果想要将上述数据类型的数据永久保存到NSUserDefaults中去,只需要简单的操作(一个Value 一个Key ),例如,想要保存一个NSString的对象,代码实现为:将数据取出也很简单,只需要取出key 对应的值就好了,代码如下:注意:对相同的Key赋值约等于一次覆盖,要保证每一个Key的唯一性值得注意的是:NSUserDefaults 存储的对象全是不可变的(这一点非常关键,弄错的话程序会出bug),例如,如果我想要存储一个NSMutableArray 对象,我必须先创建一个不可变数组(NSArray)再将它存入NSUserDefaults中去,代码如下:取出数据是一样的,想要用NSUserDefaults中的数据给可变数组赋值先给出一个错误的写法:正确的写法:二、使用NSUserDefaults 存储自定义对象1、将自定义类型转换为NSData类型当数据重复而且多的时候(例如想存储全班同学的学号,,性别(这个数据量可能太大了)),如果不用SQLite存储(多数据最好还是用这个),你可以选择使用归档,再将文件写入本地,但是这种方式和NSUserDefaults比起来麻烦多了(因为NSFileManage 本来就挺复杂),但是问题是,NSUserDefaults本身不支持自定义对象的存储,不过它支持NSData的类型,下面举一个例子来介绍。
IOSNSUserDefault记住用户名及密码功能的实例代码

IOSNSUserDefault记住⽤户名及密码功能的实例代码⼀般的登录界⾯都会有⼀个记住密码的选项,要实现这个功能可以使⽤NSUserDefault,这⾥只是讲解明⽂的处理⽅式,虽然这样是有⼀定的风险性的但是⽬前只是了解如何实现这个功能:⾸先声明⼀个NSUserDefault对象:let userDefaults = NSUserDefaults.standardUserDefaults() //本地操作所需然后根据是否记住密码按钮的状态来判断是否要为⽤户名和密码设置值,如果是记住密码,那么需要取出需要记住的密码,并且为这两个TextField赋值。
在viewDidLoad⽅法中添加如下代码:///检查记住密码标记,如果为YES,那么就读取⽤户名和密码并为TextField赋值///并将图标背景设置为记住状态,如果为NO,那么设置背景为未记住状态if(userDefaults.boolForKey("isRememberPsd")){userDefaults.setBool(true, forKey: "isRememberPsd")isRemberPW.setBackgroundImage(UIImage(named: "pwd_checked.png"), forState: .Normal)erName.text = userDefaults.stringForKey("userName")self.PassWord.text = userDefaults.stringForKey("userPsw")}else if(!userDefaults.boolForKey("isRememberPsd")){userDefaults.setBool(false, forKey: "isRememberPsd")self.isRemberPW.setBackgroundImage(UIImage(named:"pwd_unchecked.png"), forState: .Normal)}在登录按钮的点击事件中添加如下代码:if(userDefaults.boolForKey("isRememberPsd")){userDefaults.setValue(userName, forKey: "userName")userDefaults.setValue(userPsw, forKey: "userPsw")}如果为记住密码的状态,那登录前需要将⽤户名和密码写⼊到本地。
selfhost 笔记

selfhost 笔记
以下是关于SelfHost的一些笔记:
SelfHost是一个基于.NET Core的开源应用程序,用于构建、部署和运行自己的Web应用程序。
它提供了一个简单的方式来创建、配置和管理Web应用程序,并且可以轻松地与各种服务和工具集成。
以下是SelfHost的一些主要特点和功能:
1. 跨平台支持:SelfHost可以在Windows、Linux或macOS 上运行,使得您可以根据需要选择最适合您的操作系统。
2. 轻量级部署:SelfHost可以轻松地将您的Web应用程序部署到云服务器或本地计算机上,而不需要额外的配置或设置。
3. 灵活的配置:SelfHost提供了灵活的配置选项,您可以通过简单的配置文件来定制应用程序的行为和外观。
4. 集成测试:SelfHost支持集成测试,您可以使用内置的测试工具来编写和运行测试用例,以确保您的应用程序在各种情况下都能正常工作。
5. 强大的扩展性:SelfHost具有强大的扩展性,您可以根据需要添加额外的功能和模块,例如数据库连接、缓存支持等。
6. 社区支持:SelfHost有一个活跃的社区,您可以从中
获取帮助和支持,同时也可以与其他开发者分享您的经验和技巧。
总之,SelfHost是一个功能强大、易于使用的开源应用程序,可以帮助您快速构建、部署和运行自己的Web应用程序。
如果您正在寻找一个简单、灵活且可扩展的Web应用程序框架,那么SelfHost可能是一个不错的选择。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、利用NSUserDefaults进行对短小数据的存和取。
NSString
* string =
[NSString
stringWithFormat:@"JiangR"];
NSUserDefaults * userDefaults =
[NSUserDefaults standardUserDefaults];
[userDefaults
setObject:string forKey:@"string"];//存放。
[userDefaults
synchronize];//同步文件,否则程序非正常退出的时候信息将不被保存
NSLog(@"string:%@",[userDefaults
objectForKey:@"string"]);//读取的结果。
//string:JiangR
备注:NSUserDefaults
只能对如下几类数据进行存取(NSString、NSNumber、NSDate、NSArray、NSDictionary).如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的.可以让这个自定义类实现协议中的-
(id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder:
(NSCoder
*)coder方法,然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取,举例如下:
#import
@interface MySubView :
NSObject<NSCoding>
{
NSString *
_title;
NSString *
_content;
}
@property(nonatomic,retain)NSString
* title;
@property (nonatomic,retain)NSString *
content;
@end
#import ""
@implementation MySubView
@synthesize title = _title;
@synthesize content =_content;
- (void)dealloc
{
[_content release];
[_title release];
[super dealloc];
}
//若要对类对象进行enCode/deCode.就必须先对类对象的成员变量进行enCode/deCode
//对类实例的成员变量进行解码
- (id)initWithCoder:(NSCoder *)aDecoder
{
if(self = [super init]){
self.title = [aDecoder decodeObjectForKey:@"title"];
self.content = [aDecoder decodeObjectForKey:@"content"]; }
return self;
}
//对类实例的成员变量进行编码
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_title
forKey:@"title"];
[aCoder encodeObject:_content forKey:@"content"];
}
@end
以上是自定义一个类MySubView继承NSOject.
在另一个文件中:
MySubView * subView = [[MySubView alloc] init];
[subView setContent:@"什么叫做。
?"];
[subView setTitle:@"什么叫做title??"];
NSUserDefaults * userDefaults =
[NSUserDefaults standardUserDefaults];
NSData *
data = [NSKeyedArchiver
archivedDataWithRootObject:subView];//将id类型转换成可存放在NSUserDefaults中的NSDate类型。
[userDefaults setObject:data forKey:@"subView"];
[userDefaults synchronize];
[subView
release];
NSData * data_ = [[NSUserDefaults
standardUserDefaults]
objectForKey:@"subView"];//从NSUserDefaults中读取数据。
MySubView *
string = [NSKeyedUnarchiver
unarchiveObjectWithData:data_];//将读取的数据反向转换成之前的类型。
NSLog(@":%@
--- :%@",string.title,string.content);
//打印结果::什么叫做title??
--- :什么叫做。
?
NSUserDefaults
有上面的知识,然后结合文档内容,足矣!。