iOS有一套完整的数据安全体系,iOS应用程序只能访问自己的目录,这个目录称为沙箱目录,而应用程序间禁止数据的共享。访问一些特定的应用时,如联系人应用,必须通过特定的API访问。
沙箱目录
沙箱目录是一种数据安全策略,很多系统都采用沙箱设计,实现HTML5规范的一些浏览器也采用沙箱设计,沙箱目录设计的原理就是只允许自己的应用访问目录,而不允许其它的应用访问。沙箱目录有3个子目录,分别为Documents,Library,tmp。
获取沙箱目录的主目录:
NSString *path = NSHomeDirectory();
NSLog(@"path : %@", path);
Documents目录:该目录用于存储非常大的文件或需要非常频繁更新的数据,能够进行iTunes或iCloud备份。
获取Documents目录位置:
NSArray *documentArray = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [documentArray lastObject];
NSLog(@"%@",documentsPath);
Library目录:在Library目录目录下面有Preferences和Caches目录,其中Preferences用于存放应用程序的设置数据,Caches可以用来存放应用程序的数据,用来存储缓存文件。
获取Library目录位置:
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSLog(@"path : %@", pathArray.lastObject);
tem目录:临时文件目录,用户可以访问它,它不能够进行iTunes或iCloud备份。
获取tem目录位置:
NSString *temPath = NSTemporaryDirectory();
NSuserDefault
NSUserDefaults是一个分层的持久化进程间(可选的分布式)键值存储,为存储用户设置而优化。定义的是一个用户默认数据库的接口。
NSUserDefaults是一个单例,每个应用都有一个(也只有一个)NSUserDefaults对象。向NSUserDefaults类发送standardUserDefaults消息可以得到该对象。
使用NSUserDefaults对象读取信息时,NSUserDefaults会缓存信息,设置信息时,它将在当前进程中同步更改,并异步更改为持久存储和其他进程。存储在NSUserDefaults中的本地数据在应用程序重新启动时保持不变。
对于存储在其中的任何键,都可以使用键值观察来观察NSUserDefaults,当NSUserDefaults 实例所存储的数据变更时,系统会发送 NSUserDefaultsDidChangeNotification 的通知,通知会返回当前更改的 NSUserDefaults 实例对象回来。
NSUserDefaults支持的数据类型
NSUserDefaults适合存储轻量级的经常查询并偶尔修改的本地数据,使用的Key必须是NSString对象,一个键对应一项设置(preference)。存取的对象必须是对象或者基本类型的数值。如果是对象,则必须是可序列化的(serializable)对象。支持的数据类型有:NSNumber,NSString,NSDate,NSArray,NSDictionary,BOOL。注意:NSUserDefaults 存储的对象全是不可变的。
NSUserDefaults文件的存储路径
存储文件的沙盒路径为: Library/Preferences
存储文件的格式为: .plist
例如 :
截屏2020-06-17下午11.24.55.pngNSUserDefaults的域
UserDefaults数据库中其实是由多个层级的域组成的,当读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不同的域有不同的功能,有些域是可持久的,有些域则不行。默认包含五个Domain,如下:
- 1、参数域( argument domain)有最高优先权。
- 2、应用域(application domain)是最重要的域,它存储着你app通过NSUserDefaults set...forKey添加的设置。
- 3、全局域(global domain)则存储着系统的设置。
- 4、语言域(language-specific domains)则包括地区、日期等。
- 5、注册域(registration domain)仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。
例如:当某个界面是第一次运行时,这时的key值(键)所对应的值还不存在,所以NSUserDefaults对象会使用默认值为0。但是对于某些设置,可能需要临时的、非0的默认值(如"出厂设置"),否则应用将无法正确的运行。一般默认值都是存放于注册域中。默认情况下,应用域是空的,没有键也没有值。当用户第一次修改某个设置时,相应的值会通过指定的键加入应用域。当通过NSUserDefaults对象获取某个设置的值时,该对象先会在应用域查找,如果没有,NSUserDefaults则会在注册域中查找并返回默认值。查询顺序:参数域 -> 应用域 -> 全局域 -> 语言域 ->注册域。
NSUserDefaults的优缺点
优点:
- 不需要关心文件名。
- 快速进行键值对存储。
- 直接存储基本数据类型。
缺点:
- 不能存储自定义数据。
- 取出的数据都是不可变的。
NSuserDefault提供的常用属性与函数
@property (class, readonly, strong) NSUserDefaults *standardUserDefaults;
属性描述 : 返回NSUserDefaults的全局实例。
@property (class, readonly, strong) NSUserDefaults *standardUserDefaults;
- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
函数描述 : 立即在搜索列表项中存储所提供Key的值(如果传递的值为nil,则删除该值),然后在其他进程可以使用该值的情况下异步持久存储该值。
参数 :
value : 要存储在默认数据库中的对象。
defaultName : 与值关联的键。
- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
- (BOOL)synchronize;
函数描述 : 等待对默认数据库的任何挂起的异步更新并返回(等待数据持久持久存储),此函数不推荐使用。
返回值 : 如果数据成功保存到磁盘,则为YES,否则为NO。
- (BOOL)synchronize;
例如存储数据:
[[NSUserDefaults standardUserDefaults] setObject:@"好高兴啊" forKey:@"又吃成长快乐了"];
[[NSUserDefaults standardUserDefaults] synchronize];
- (nullable id)objectForKey:(NSString *)defaultName;
函数描述 : 返回与指定键关联的对象。此方法按域的列出顺序搜索包含在搜索列表中的域,并返回与指定默认值的第一个匹配项关联的对象。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定键关联的对象,如果找不到键,则为nil。
- (nullable id)objectForKey:(NSString *)defaultName;
例如取出数据:
NSString *Study = [NSUserDefaults standardUserDefaults] objectForKey:@"又吃成长快乐了"];
- (void)removeObjectForKey:(NSString *)defaultName;
函数描述:删除指定默认Key的值。如果在搜索列表中位于标准应用程序域之前的域中存在相同的Key,则删除默认值不会影响objectForKey:方法返回的值。
参数 :
defaultName : 要移除其值的Key。
- (void)removeObjectForKey:(NSString *)defaultName;
- (nullable NSString *)stringForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的字符串。返回的字符串是不可变的,即使最初设置的值是可变的字符串。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 对于字符串值,与指定Key关联的字符串;对于数字值,为数字的字符串值。如果默认值不存在或不是字符串或数值,则返回nil。
- (nullable NSString *)stringForKey:(NSString *)defaultName;
- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的数组。返回的数组及其内容是不可变的,即使最初设置的值是可变的。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定Key关联的数组,如果Key不存在或其值不是数组,则为nil。
- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的字典对象。返回的字典及其内容是不可变的,即使最初设置的值是可变的。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定键关联的NSDictionary对象,如果键不存在或其值不是NSDictionary,则为nil。
- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
- (nullable NSData *)dataForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的数据对象。返回的数据对象是不可变的,即使最初设置的值是可变的数据对象。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定键关联的NSData对象,如果键不存在或其值不是NSData对象,则为nil。
- (nullable NSData *)dataForKey:(NSString *)defaultName;
- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的字符串数组。返回的数组及其内容是不可变的,即使最初设置的值是可变的。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 :字符串对象数组,如果指定的默认值不存在、默认值不包含数组或数组不包含字符串,则为nil。
- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
函数描述 : 将指定的默认Key的值设置为指定的整数值。这是一个调用setObject:forKey:的方便方法。
参数 :
value : 要存储在默认数据库中的整数值。
defaultName : 与值关联的Key。
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (NSInteger)integerForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的整数值。此方法自动将某些值强制转换为等效的整数值(如果可以确定转换的话)。布尔值YES变为1,NO变为0。浮点数变为小于该数的最大整数(例如,2.67变为2)。表示整数的字符串变为等效整数(例如“123”变为123)。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定Key关联的整数值。如果指定的Key不存在,则此方法返回0。
- (NSInteger)integerForKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
函数描述 : 将指定默认Key的值设置为指定的浮点值。这是一个调用setObject:forKey:的方便方法。
参数 :
value : 要存储在默认数据库中的浮点值。
defaultName : 与值关联的Key。
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的浮点值。此方法自动将某些值强制转换为等效的浮点值(如果可以确定转换的话)。布尔值YES变为1.0,NO变为0.0。整数变为等效的浮点(例如,2变为2.0)。表示浮点数的字符串变为等效浮点数(例如,“123.4”变为123.4)。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定Key关联的浮点值。如果Key不存在,则此方法返回0。
- (float)floatForKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
函数描述 : 将指定的默认Key的值设置为双精度浮点值。这是一个调用setObject:forKey:的方便方法。
参数 :
value : 要存储在默认数据库中的双精度浮点值。
defaultName :与值关联的Key。
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
函数描述 : 返回与指定键关联的双精度浮点值。此方法自动将某些值强制转换为等效的双精度值(如果可以确定)。布尔值YES变为1.000000,NO变为0.000000。整数变为等效的双精度数(例如,2变为2.000000)。表示浮点数的字符串变为等效的双精度(例如,“123.40000000000001”变为123.40000000000001)。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定Key关联的双精度浮点值。如果Key不存在,则此方法返回0。
- (double)doubleForKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
函数描述 : 将指定的默认Key的值设置为指定的布尔值。这是一个调用setObject:forKey:的方便方法。
参数 :
value : 要存储在默认数据库中的布尔值。
defaultName : 与值关联的Key。
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
函数描述 : 返回与指定Key关联的布尔值。此方法自动将某些“truthy”值(如字符串“true”、“YES”和“1”、数字1和1.0)强制为布尔值YES。对于某些“falsy”值也是如此,例如字符串“false”、“NO”和“0”,以及数字0和0.0,它们自动强制为布尔值NO。
参数 :
defaultName : 当前用户默认数据库中的Key。
返回值 : 与指定Key关联的布尔值。如果指定的Key不存在,则此方法返回“否”。
- (BOOL)boolForKey:(NSString *)defaultName;
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
函数描述 : 将指定的默认Key的值设置为指定的URL。如果url是文件url,则此方法采用绝对url,确定其路径是否可以相对于用户的主目录创建,如果可以,则使用stringByAbbreviatingWithTildeInPath方法对其进行缩写。如果url不是文件url,则通过调用archivedDataWithRootObject:方法并将url作为根对象传递来创建数据对象。
参数 :
url : 要存储在默认数据库中的URL。
defaultName : 与值关联的Key。
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
- (void)registerDefaults:(NSDictionary<NSString *, id> *)registrationDictionary;
函数描述 : 将指定字典的内容添加到注册域。如果没有注册域,则使用指定的词典创建一个注册域,并将NSRegistrationDomain添加到搜索列表的末尾。注册域的内容不会写入磁盘;每次启动应用程序时都需要调用此方法。可以将plist文件放在应用程序的Resources目录中,并使用从该文件读取的内容调用registerDefaults:方法。
参数 :
dictionary : 要注册的键和值的字典。
- (void)registerDefaults:(NSDictionary<NSString *, id> *)registrationDictionary;
- (void)addSuiteNamed:(NSString *)suiteName;
函数描述 : 将指定域名插入到接收方的搜索列表中。suiteName域类似于bundle标识符字符串,但不一定绑定到特定的应用程序或bundle。一个套件可以用来保存在多个应用程序之间共享的首选项。
suiteName域的附加搜索列表在当前域之后但在全局默认值之前搜索(即,当添加套件时,首选项子系统首先搜索应用程序的用户首选项,然后再次搜索,就好像它是一个bundle标识符等于suiteName的应用程序一样,最后搜索全局首选项)。不支持传递NSGlobalDomain或当前应用程序的束标识符。
参数 :
suiteName : 要插入的域名。
- (void)addSuiteNamed:(NSString *)suiteName;
- (void)removeSuiteNamed:(NSString *)suiteName;
函数描述 : 从接收器的搜索列表中删除指定的域名。
参数 :
suiteName : 要删除的域名。
- (void)removeSuiteNamed:(NSString *)suiteName;
- (NSDictionary<NSString *, id> *)dictionaryRepresentation;
函数描述 : 返回一个字典,其中包含搜索列表中域中所有键值对的并集。与objectForKey:一样,搜索列表中较早的域中的键值对具有优先权。合并的结果不会保留每个条目来自哪个域的信息。
返回值 : 包含键值的字典。这些键是默认值的名称,每个键对应的值是一个属性列表对象(NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary)。
- (NSDictionary<NSString *, id> *)dictionaryRepresentation;
@property (readonly, copy) NSArray<NSString *> *volatileDomainNames;
属性描述 : 当前易失性的域名。域名用字符串表示。通过将返回的域名传递给volatileDomainForName:方法,可以获取每个域的内容。
@property (readonly, copy) NSArray<NSString *> *volatileDomainNames;
- (NSDictionary<NSString *, id> *)volatileDomainForName:(NSString *)domainName;
函数描述 : 返回指定易失性域的字典。
参数 :
domainName : 需要其Key和值的域。
返回值 : 属于域的Key和值的字典。字典中的键是默认值的名称,每个Key对应的值是一个属性列表对象(NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary)。
- (NSDictionary<NSString *, id> *)volatileDomainForName:(NSString *)domainName;
- (void)setVolatileDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;
函数描述 : 为指定的易失性域设置字典。如果已存在具有指定名称的易失性域,则此方法引发NSInvalidArgumentException。
参数 :
domain : 要分配给域的Key和值的字典。
domainName : 要设置其字典的域。
- (void)setVolatileDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;
- (void)removeVolatileDomainForName:(NSString *)domainName;
函数描述 : 从用户的默认值中删除指定的易失性域。
参数 :
domainName : 要删除的易失性域。
- (void)removeVolatileDomainForName:(NSString *)domainName;
- (NSArray *)persistentDomainNames API_DEPRECATED("Not recommended", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
函数描述 : 返回当前持久域名的数组(不推荐使用)。通过将返回的域名传递给persistentDomainForName:方法,可以获取每个域的Key和值。
返回值 : 包含域名的NSString对象数组。
- (NSArray *)persistentDomainNames API_DEPRECATED("Not recommended", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
- (nullable NSDictionary<NSString *, id> *)persistentDomainForName:(NSString *)domainName;
函数描述 : 返回指定域的默认值的字典表示形式。调用此方法相当于使用initWithSuiteName初始化用户默认值对象:传递domainName并对其调用dictionaryRepresentation方法。
参数 :
domainName : 要表示的域的名称。
返回值 : 包含每个默认名称对应默认值的及其Key的字典。
- (nullable NSDictionary<NSString *, id> *)persistentDomainForName:(NSString *)domainName;
- (void)setPersistentDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;
函数描述 : 为指定的持久域设置字典。调用此方法相当于使用initWithSuiteName初始化用户默认值对象:传递domainName,并对域中每个键值对调用setObject:forKey:的方法。
参数 :
domain : 要分配给域的Key和值的字典。
domainName : 要设置其内容的域的名称。
- (void)setPersistentDomain:(NSDictionary<NSString *, id> *)domain forName:(NSString *)domainName;
- (void)removePersistentDomainForName:(NSString *)domainName;
函数描述 : 从用户的默认值中删除指定持久域的内容。调用此方法相当于使用initWithSuiteName:传递domainName初始化用户默认对象,并对其每个键调用removeObjectForKey:方法。更改永久性域时,将发布NSUserDefaultsDidChangeNotification通知。
参数 :
domainName : 要删除其内容的域的名称。
- (void)removePersistentDomainForName:(NSString *)domainName;
- (BOOL)objectIsForcedForKey:(NSString *)key;
函数描述 : 返回一个布尔值,指示指定的Key是否由管理员管理。此方法假定Key是与当前用户和应用程序关联的首选项。对于托管Key,应用程序应禁用允许用户修改Key的值的任何用户界面。
参数 :
key : 要检查其状态的Key。
返回值 :如果指定密钥的值由管理员管理,则为“YES”,否则为“NO”。
- (BOOL)objectIsForcedForKey:(NSString *)key;
- (BOOL)objectIsForcedForKey:(NSString *)key inDomain:(NSString *)domain;
函数描述 : 返回一个布尔值,指示指定域中的Key是否由管理员管理。此方法假定Key是与当前用户关联的首选项。对于托管Key,应用程序应禁用允许用户修改密Key的值的任何用户界面。
参数 :
key : 要检查其状态的Key。
domain : Key的域。
返回值 : 如果Key由指定域中的管理员管理,则为“YES”,否则为“NO”。
- (BOOL)objectIsForcedForKey:(NSString *)key inDomain:(NSString *)domain;
NSUserDefaults的初始化函数
- (nullable instancetype)initWithSuiteName:(nullable NSString *)suitename API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0)) NS_DESIGNATED_INITIALIZER;
函数描述 : 使用指定域标识符的默认值创建初始化的NSUserDefaults对象。在开发应用程序套件时,可以使用此方法在应用程序之间共享首选项或其他数据,或者在开发应用程序扩展时,在扩展程序与其包含的应用程序之间共享首选项或其他数据。参数和注册域在NSUserDefaults的所有实例之间共享。
suiteName参数匹配相应CFPreferences api的域参数(在Foundation和Core Foundation常量之间转换时除外)。例如 :
id userDefaultsValue = [[[NSUserDefaults alloc] initWithSuiteName:@"someDomain"] objectForKey:@"someKey"];
id preferencesValue = CFPreferencesCopyAppValue(@"someKey", @"someDomain");
//userDefaultsValue和preferencesValue相等
参数 :
suitename : 搜索列表的域标识符。如果将nil传递给这个参数,系统将使用standardUserDefaults类方法使用的默认搜索列表。因为套件管理指定应用程序组的默认值,所以套件名称必须与应用程序的主bundle identifier不同。NSGlobalDomain也是一个无效的套件名称,因为它不可由应用程序写入。
返回值 : 使用指定域标识符的默认值创建初始化的NSUserDefaults对象。
- (nullable instancetype)initWithSuiteName:(nullable NSString *)suitename API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0)) NS_DESIGNATED_INITIALIZER;
- (nullable id)initWithUser:(NSString *)username API_DEPRECATED("Use -init instead", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
函数描述 : 创建用指定用户帐户的默认值初始化的NSUserDefaults对象。此方法不会在搜索列表中放入任何内容。只有在分配了自己的NSUserDefaults实例而不是使用共享实例时才调用它。通常不使用此方法初始化NSUserDefaults的实例。超级用户使用的应用程序可以使用此方法更新许多用户的默认数据库。启动应用程序的用户必须对新用户的默认数据库具有适当的访问权限(读、写或同时访问),否则此方法将返回nil。
参数 :
username : 用户帐户的名称。
返回值 : 已初始化的NSUserDefaults对象,其参数和注册域已设置。如果当前用户无权访问指定的用户帐户,则此方法返回nil。
- (nullable id)initWithUser:(NSString *)username API_DEPRECATED("Use -init instead", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
域的常量
FOUNDATION_EXPORT NSString * const NSGlobalDomain;
常量描述 : 由所有应用程序所看到的默认值组成的域(全局域)。
FOUNDATION_EXPORT NSString * const NSGlobalDomain;
FOUNDATION_EXPORT NSString * const NSArgumentDomain;
常量描述 : 从应用程序的参数解析默认值组成的域(参数域)。
FOUNDATION_EXPORT NSString * const NSArgumentDomain;
FOUNDATION_EXPORT NSString * const NSRegistrationDomain;
常量描述 : 由一组临时缺省值组成的域,其值可以由应用程序设置,以确保搜索始终是成功的(注册域)。
FOUNDATION_EXPORT NSString * const NSRegistrationDomain;
NSUserDefaults通知
FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsSizeLimitExceededNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);
通知描述 : 当用户默认数据中存储更多数据时发送。
FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsSizeLimitExceededNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsNoCloudAccountNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);
通知描述 : 当设置了云默认时,但没有登录iCloud用户发送。
FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsNoCloudAccountNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsDidChangeAccountsNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);
通知描述 : 当用户更改主iCloud帐户时发送。
FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsDidChangeAccountsNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsCompletedInitialSyncNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macOS);
函数描述 : 发布时,默认完成下载数据,无论是第一次设备连接到一个iCloud帐户,或当用户切换他们的主要iCloud帐户发送。
FOUNDATION_EXPORT NSNotificationName const NSUbiquitousUserDefaultsCompletedInitialSyncNotification API_AVAILABLE(ios(9.3), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsDidChangeNotification;
函数描述 : 在当前进程中更改用户默认值时发送
FOUNDATION_EXPORT NSNotificationName const NSUserDefaultsDidChangeNotification;
对象归档
对象归档是一种序列化方式,为了便于数据传输,先将归档对象序列化一个文件,然后再通过反归档将数据恢复到对象中。归档技术可以实现数据的持久化,不过在大量数据和频繁读写的情况下,它就不太合适了。
对一个对象进行完整归档需要满足的条件为该对象的类必须实现NSCoding协议,而且每个成员变量都应该基本数据类型或都是实现NSCoding协议的某个类的实例。
归档类NSKeyedArchiver和反归档类NSKeyedUnArchiver总是与NSData关联在一起。NSData封装了字节数据的缓存类,提供了读取数据文件的方法,具体如下:
+ (nullable instancetype)dataWithContentsOfFile:(NSString *)path;它是静态工厂方法,用于从文件读取数据来创建NSData对象。
+ (nullable instancetype)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;它是静态工厂方法,用于从文件读取数据创建NSData对象,options参数是指定读取数据选项,error返回读取数据的错误。
- (nullable instancetype)initWithContentsOfFile:(NSString *)path;它是实例构造函数,用于从文件读取数据来创建NSData对象。
- (nullable instancetype)initWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;它是实例构造函数,用于从文件读取数据创建NSData对象,options参数是指定读取数据选项,error返回读取数据的错误。
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;将NSData对象写入文件,atomically参数是否写入辅助文件,false时数据直接写入目标文件路径,true数据写入辅助文件,写入成功后将辅助文件路径改为目标文件路径。当目标文件已经存在时,atomically设置为true,可以防止系统崩溃导致旧的文件破坏。
- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;通过提供写入选项将NSData对象写入文件,options参数是指定写入数据选项,error参数是返回写入数据的错误。
归档过程是使用NSKeyedArchiver对象归档数据,具体过程为先将归档数据写入NSData对象,然后将NAData对象写入归档文件。反归档过程是从归档文件中读取数据到NSData对象,再利用NSKeyedUnArchiver对象从NSData对象中反归档出数据。
SQLite数据库
2000年,D.里查德.希普开发并发布了嵌入式系统使用的关系数据库SQlite,目前的主流版本是SQLite3。SQLite是开源的,它采用C语言编写,具有可移植性强,可靠性高,小而易用的特点。SQLite运行时与使用它的应用程序之间共用相同的进程空间,而不是单独的两个进程。SQLite提供了对SQL-92标准的支持,支持多表、索引、事务、视图和触发。SQLite是无数据类型的数据库,字段不用指定类型。
虽然SQLite可以忽略数据类型,但从编程规范上讲,我们还是应该在Create Table语句中指定数据类型。因为数据类型可以表明这个字段的含义,便于阅读和理解代码。
SQlite支持的常见数据类型有:
- INTEGER —— 有符号的整数类型。
- REAL —— 浮点类型。
- TEXT —— 字符串类型,采用UTF-8或UTF-16字符编码。
- BLOB —— 二进制大对象类型,能够存放任何二进制数据。
SQLite中没有BOOLEAN类型,可以采用整数0和1代替。SQLite中也没有时间和日期类型,它们存储在TEXT、REAL和INTEGER类型中。为了兼容SQL-92标准中的其他数据类型,我们可以将它们转换成上述几种类型:
- 将VARCHAR、CHAR和CLOB转换为TEXT类型。
- 将FLOAT、DOUBLE转换为REAL类型。
- 将NUMERIC转换为INTEGER或REAL类型。
网友评论