iOS中的数据存储方式_Preference(NSUserDefaults)
NSUserDefaults适合存储轻量级的本地数据,项目中,我会把一些简单的数据密码、网址、登陆状态BOOL、整型/浮点型数据等和用户有关的数据用它存储。但是它不能存储自定义的对象!
实例化一个 NSUserDefaults 对象:
/** * @brief 创建app整个生命周期内的唯一示例对象 * */ + (NSUserDefaults *)standardUserDefaults; /** * @brief 释放之前的 NSUserDefaults 对象且置为 nil。而且之前设置的 KVO 全部不在存在。 */ + (void)resetStandardUserDefaults;
获取Value值:
/** 根据指定的key值获取字符串 等同于 - (nullable id)objectForKey:(NSString *)anAttribute; (它会把 NSNumber转为 NSString) */ - (nullable NSString *)stringForKey:(NSString *)defaultName; /// -arrayForKey: is equivalent to -objectForKey:, except that it will return nil if the value is not an NSArray. /** 根据key值获取数组(等同于 - (nullable id)objectForKey:(NSString *)anAttribute;) */ - (nullable NSArray *)arrayForKey:(NSString *)defaultName; /** 根据key值获取字典(等同于 - (nullable id)objectForKey:(NSString *)anAttribute;) */ - (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName; - (nullable NSData *)dataForKey:(NSString *)defaultName; - (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName; /** 根据key值获取整型(等同于 - (nullable id)objectForKey:(NSString *)anAttribute;) 如果 value 是 NSNumber 类型,它自动把 value 转为 NSInteger 返回; 如果 value 是 NSString 类型,它可能把 value 转为 NSInteger 返回; 如果 value 是 bool 类型, 它会转换(YES转为1;NO转为0)返回; 如果 value 不存在或不能被转换成一个整数,它会返回0。 */ - (NSInteger)integerForKey:(NSString *)defaultName; /** 只会返回 float 值,且内部不会做任何转换(若 value 为 bool,内部不会转换) */ - (float)floatForKey:(NSString *)defaultName; /** 只会返回double值,且内部不会做任何转换(若value为boolean,也不会转换) */ - (double)doubleForKey:(NSString *)defaultName; /*! -boolForKey: is equivalent to -objectForKey:, except that it converts the returned value to a BOOL. If the value is an NSNumber, NO will be returned if the value is 0, YES otherwise. If the value is an NSString, values of "YES" or "1" will return YES, and values of "NO", "0", or any other string will return NO. If the value is absent or can't be converted to a BOOL, NO will be returned. */ /** 根据key值获取bool值(等同于 - (nullable id)objectForKey:(NSString *)anAttribute;) 如果 value 是 NSNumber 类型 或 value 为 0,返回NO 如果 value 是 NSString类型的“YES”“1”,返回NO;其他任何字符串将返回NO; 如果 value 不存在或不能被转换成一个整数,它会返回NO。 */ - (BOOL)boolForKey:(NSString *)defaultName; /** 根据key值获取NSURL(等同于 - (nullable id)objectForKey:(NSString *)anAttribute;) 如果 value 是字符串路径,将会被构建为 URL路径; 如果 value 是被归档的 URL 它将被反归档; 如果 value 不存在或不能被转换成一个整数,它会返回 nil。 */ - (nullable NSURL *)URLForKey:(NSString *)defaultName;
设置(存储)Value:
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName; - (void)setFloat:(float)value forKey:(NSString *)defaultName; - (void)setDouble:(double)value forKey:(NSString *)defaultName; - (void)setBool:(BOOL)value forKey:(NSString *)defaultName; - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName;
删除key对应的值:
- (void)removeObjectForKey:(KeyType)aKey;
NSUserDefaults的值改变的通知:
FOUNDATION_EXPORT NSString * const NSUserDefaultsDidChangeNotification;
不会具体指导哪个key-value值改变了。
只要我们操作了NSUserDefaults,必须进行数据的同步,否则我们无法获取最新的数值:
- (BOOL)synchronize;
参考文档: