前述
1.NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.
2.如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不成功的
3.解决的方法是用自定义的<NSCoding>的协议方法,- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。
4.这是个字典,创建方式叫单例 保存在偏好设置文件夹里的plist文件中
5.复杂对象归档,要签订nscoding方法,并且实现两个协议的方法,放在数组里的复杂对象归档也要签协议
6.一个自定义的类中有另一个自定义类的对象,那么所有的类都要实现NSCoding
1.存入字符串再读取字符串
NSString *str = [NSString stringWithStrig:@"nihao"];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
存入步骤:
[userDefaults setObject:string forKey:@"thisISkey"];
读取代码:
NSString *value = [userDefaults objectForKey:"thisISkey"];
2.存字典
要实现归档反归档的操作需要签订一个协议NSCoding
(1)自定义类的.h文件中
@interface Student : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSString *hobby;
//针对这四条属性,写一个自定义的初始化方法和便利构造器
- (instancetype)initWithName:(NSString *)name
sex:(NSString *)sex
hobby:(NSString *)hobby
age:(NSInteger)age;
+ (instancetype)studentWithName:(NSString *)name
sex:(NSString *)sex
hobby:(NSString *)hobby
age:(NSInteger)age;
@end
(2)自定义的.m文件中
签订完NSCoding协议之后需要实现两个协议方法,一个是归档的时候使用的,另一个是反归档的时候使用
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_sex forKey:@"sex"];
[aCoder encodeObject:_hobby forKey:@"hobby"];
[aCoder encodeInteger:_age forKey:@"age"];
//使用encode方法要和数据类型相互匹配
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.hobby = [aDecoder decodeObjectForKey:@"hobby"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
- (instancetype)initWithName:(NSString *)name
sex:(NSString *)sex
hobby:(NSString *)hobby
age:(NSInteger)age
{
self = [super init];
if (self) {
self.name = name;
self.sex = sex;
self.hobby = hobby;
self.age = age;
}
return self;
}
(3)存取时通过NSData做载体
Student *stu = [[Student alloc] init];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *defaultsData = [NSKeyedArchiver archivedDataWithRootObject:stu];
[defaults setObject:defaultsData forKey:@"student"];
[stu release];
NSData *data = [defaults objectForKey:@"myBusinessCard"];
stu = [NSKeyedUnarchiver unarchiveObjectWithData:data];