NSUserdefaults的创建方法及相关知识点

NSUserdefaults的创建方法及相关知识点

核心API

class : NSUserdefaults
delegate : 无
涉及的API : (API的官方详细注释(英文)详见本章结尾)

/** 1. 获取个公有的NSUserdefaults实例(系统中提供的) */
+ (NSUserDefaults *)standardUserDefaults
+ (void)resetStandardUserDefaults

/** 2. 初始化一个NSUserdefaults对象 */
- (instancetype)init

// 用于应用程序之间共享数据(当开发应用程序套件时)
- (instancetype)initWithSuiteName:(NSString *)suitename

/** 3. 注册的内容存在参数dictionary中, 注册的内容不直接写入磁盘中, 详见本文结尾的API */ 
- (void)registerDefaults:(NSDictionary *)dictionary

功能实现

#

思路

  1. 主要是针对NSUserdefaults的一些方法和在应用时需要注意的地方进行归纳, 供大家参考和自己学习.

  2. 利用代码来解析说明

(1). 找到NSUserdefaults的存放位置

- (void)findIt
{

/** 这是我根据自己的系统找到的NSUserdefaults的存放位置 */
    NSArray *array = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

    NSString *path = [NSString stringWithFormat:@"%@", [array firstObject]];

    NSLog(@"%@", path);

/** 说明: 通过我们输出的这个路径打开文件夹(Library文件夹), 在该文件夹下有一个Perferences文件夹, 再打开这个文件夹, 这时就会发现在这个文件夹下有一个plist文件.
 这个plist文件就是NSUserdefaults的真正面纱了. 
 好了知道了这个类的实质, 我们就会更好的了解这个类, 接下来我们就对它的方法和需要注意的地方进行说明 */

}
(2). NSUserdefaults的创建

- (void)createUser
{

     /* 若系统中存在则返回系统中的对象, 不存在则创建一个对象.(常用方法) */
    NSUserDefaults *user1 = [NSUserDefaults standardUserDefaults];

   /* 该方法的官方API注解
    * Synchronizes any changes made to the shared user defaults object and releases it from memory. 
    */
    [NSUserDefaults standardUserDefaults];

    /** 返回的对象就是系统给定的plist文件 */
    NSUserDefaults *user2 = [[NSUserDefaults alloc] init];

}
(3). 存取数据

说明 : 在对NSUserdefaults进行存取数据时, 首先要知道它可以存放那些类型的数据. NSUserdefaults可以存放的数据类型有 : 基本类型(float, double, intgeter等), NSString, NSArray, NSDictionary, NSData, NSNumber, BOOL, NSURL类型. 数据的存取是在对持久域进行的操作.

注意 : 在对NSUserdefaults进行取数据时, 要注意, 它的返回值是不可变的, 就是当你向NSUserdefaults中存放一个可变类型的对象时, 取出时, 会返回一个不可变对象

切记 : 在向NSUserdefaults中存放数据时, 切记不要存放类型是MSNULL类型的数据, 否则程序会崩溃(亲身领教过啊, 不信你可以进行实验), 所以当你向NSUserdefaults中存放数据之前最好判断你所存放的数据是否是NSNULL类型的数据, 如果是可以将给类型数据转化为nil或者其他形式



 - (void)addData
{

    /** 先使用系统为我们提供的默认的plist文件, 返回一个NSUserdefaults类 */
    self.user = [NSUserDefaults standardUserDefaults];

    [self.user setObject:@"张三" forKey:@"name"];

    [self.user setInteger:21 forKey:@"age"];

    [self.user setFloat:99.3 forKey:@"score"];

    [self.user setDouble:170.66 forKey:@"height"];

    [self.user setURL:[NSURL URLWithString:@"1944154449@qq.com"] forKey:@"email"];

    NSArray *array = @[@"数学", @"语文", @"英语"];
    [self.user setObject:array forKey:@"subject"];

    NSDictionary *dic = @{@"父亲" : @"张毅", @"母亲" : @"刘岩"};
    [self.user setObject:dic forKey:@"family"];

 /** 说明: 
 * 当你对NSUserdefaults存完数据之后, 你可以查看利用上述的找到NSUserdefaults的位置的方法(- (void)findIt)来查看是否存入数据 
 *
 * 该方法只用来是否将数据写入磁盘, 如果返回YES说明数据已经成功写入磁盘, 如果返回NO说明数据没有写入磁盘.
 * 
 * 系统也会周期性的调用该方法来为我们将数据存储到磁盘, 当你不想等待系统自动调用的话, 可以自动调用, 就像该例子一样. 
 */
    [self.user synchronize];

 /** 返回对应域中的所有键值对 */    
 NSLog(@"%@", [self.user dictionaryRepresentation]);

}

/** 在对NSUserdefaults进行取数据时, 要注意, 它的返回值是不可变的, 就是当你向NSUserdefaults中存放一个可变类型的对象时, 取出时, 会返回一个不可变类型的对象 */

/** 下面就进行试验  */
- (void)getData
{
    NSMutableArray *mArr = @[@"1", @"2"].mutableCopy;

    NSLog(@"set : %@", [mArr class]);

    [self.user setObject:mArr forKey:@"mutable"];

    NSLog(@"get : %@", [[self.user objectForKey:@"mutable"] class]);
}

/** 说明: 调用这个方法时, 你就会发现两次的输出的结果 : 

    set : __NSArrayM (可变类型)
    get : __NSCFArray (不可变类型)

  */

(4). 添加持久域

说明 :

持久域 : 其实持久域无非就是他的生命周期和app的生命周期相同, 只要你不卸载app的话, 持久域就会存在, 卸载app, 持久域才会随之消失.

- (void)createPersistentDomain
{

    /** 创建字典, 用来存放用户的爱好 */
    NSDictionary *dic = @{@"ball" : @"football", @"book" : @"将夜"};

    /** 添加持久域 */
    [self.user setPersistentDomain:dic forName:@"hobby"];

    /** 取出持久域 */
    NSDictionary *dic1 = [self.user persistentDomainForName:@"hobby"];
    NSLog(@"%@", dic1);

    /** 删除持久域 */
    [self.user removePersistentDomainForName:@"hobby"];

    /** 说明: 同样用上面的找到NSUserdefaults文件的位置的方法, 打开文件(- (void)findIt), 你就会发现文件中多了一个名为 hobby.plist 的文件.

    这就说明我们重新建立了一个新的持久域, 可以存放我们想存放的数据了.
     */

}
(5) . 创建添加不稳定域

说明 :

不稳定域 : 在你不退出程序时, 是可以取出不稳定域的, 但当你退出程序再进入程序时(这时将添加不稳定域的代码注掉), 当你再次取出不稳定域时, 这时, 你会发现, 上次创建的不稳定域已经不存在了;
这就是持久域与不稳定域的区别. 所以不稳定域就相当于我们自己创建的单例了, 它只在本次运行的程序中存在, 当你下次运行程序时, 就不会存在.


- (void)createvolatileDomain
{
    /** 创建一个字典 */
    NSDictionary *volatileDic = @{@"name" : @"zhangsan", @"age" : @"17"};

    /** 添加不稳定域 */
    [self.user setVolatileDomain:volatileDic forName:@"violatile"];

    /** 取出不稳定域 */
    NSLog(@" 第一页violatile: %@", [self.user volatileDomainForName:@"violatile"]);

    /** 删除不稳定域 */
    [self.user removeVolatileDomainForName:@"violatile"];

}
(6) 套件的创建及添加

说明 :

对于套件的创建方法 : 调用该方法, 重新又创建了一个plist文件, 就是我们应用程序的套件

套件的作用: 一个应用程序是不能访问或修改其他应用程序的偏好的.
当你在当前应用程序访问其他应用程序时, 系统读取数据的文件并不是被访问的应用程序的文件, 而是这个套件中的数据.
套件就是在开发应用程序扩展时,在扩展和包含应用程序之间共享偏好或其他数据的.


/** 创建一个套件在Library目录下的Perferences文件夹下 */
NSUserDefaults *suite = [[NSUserDefaults alloc] initWithSuiteName:@"nihao"];

/** 同理可以利用这个方法来添加套件 */    
- (void)addSuiteNamed:(NSString *)suiteName

/** 利用该方法删除套件 */
- (void)removeSuiteNamed:(NSString *)suiteName

API 官方注释(英文)


/** If the shared defaults object does not exist yet, it is created with a search list containing the names of the following domains, in this order:

NSArgumentDomain, consisting of defaults parsed from the application’s arguments

A domain identified by the application’s bundle identifier

NSGlobalDomain, consisting of defaults meant to be seen by all applications

Separate domains for each of the user’s preferred languages

NSRegistrationDomain, a set of temporary defaults whose values can be set by the application to ensure that searches will always be successful

The defaults are initialized for the current user. Subsequent modifications to the standard search list remain in effect even when this method is invoked again—the search list is guaranteed to be standard only the first time this method is invoked.
 */

/** 方法 */
+ (NSUserDefaults *)standardUserDefaults

/** A subsequent invocation of standardUserDefaults creates a new shared user defaults object with the standard search list. */

/** 方法 */
+ (void)resetStandardUserDefaults

/**This method does not put anything in the search list. Invoke it only if you’ve allocated your own NSUserDefaults instance instead of using the shared one.*/

/** 方法 */
- (instancetype)init

/** Use this method in scenarios such as:

When developing an app suite, to share preferences or other data among the apps

When developing an app extension, to share preferences or other data between the extension and its containing app */

/** 方法 */
- (instancetype)initWithSuiteName:(NSString *)suitename

/** API中对于套件的描述 */

/** A sandboxed app cannot access or modify the preferences for any other app.
 (For example, if you add another app's domain using the addSuiteNamed: method, you do not gain access to that app's preferences.)

Attempting to access or modify another app's preferences does not result in an error, but when you do, 
OS X actually reads and writes files located within your app's container, rather than the actual preference files for the other application. */

/** API中对于注册域的描述 */
If there is no registration domain, one is created using the specified dictionary, and NSRegistrationDomain is added to the end of the search list.

The contents of the registration domain are not written to disk; you need to call this method each time your application starts. You can place a plist file in the application's Resources directory and call registerDefaults: with the contents that you read in from that file.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值