IOS 中NSUserDefaults读取和写入自定义对象的实现方法
NSUserDefaults是一种常用的存储小量数据的方式,但是它只能存储NSString, NSNumber, NSDate, NSArray, NSDictionary等几种数据类型。如果要存储自定义的对象,需要实现<NSCoding>协议,并将对象编码到NSData中,然后存储到NSUserDefaults中。
在实现<NSCoding>协议时,需要实现两个方法:- (id)initWithCoder:(NSCoder *)coder和- (void)encodeWithCoder:(NSCoder *)coder。其中,- (id)initWithCoder:(NSCoder *)coder方法用于从NSCoder对象中解码出对象,而- (void)encodeWithCoder:(NSCoder *)coder方法用于将对象编码到NSCoder对象中。
例如,假设有一个名为BusinessCard的自定义类,它有两个属性:firstName和lastName。那么,在实现<NSCoding>协议时,可以使用以下代码:
```objc
@interface BusinessCard : NSObject <NSCoding> {
NSString *_firstName;
NSString *_lastName;
}
@property (nonatomic, retain) NSString *_firstName;
@property (nonatomic, retain) NSString *_lastName;
@end
@implementation BusinessCard
@synthesize _firstName, _lastName;
- (void)dealloc{
[_firstName release];
[_lastName release];
[super dealloc];
}
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
self._firstName = [coder decodeObjectForKey:@"_firstName"];
self._lastName = [coder decodeObjectForKey:@"_lastName"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:_firstName forKey:@"_firstName"];
[coder encodeObject:_lastName forKey:@"_lastName"];
}
@end
```
然后,在存储和读取BusinessCard对象时,可以使用以下代码:
```objc
BusinessCard *bc = [[BusinessCard alloc] init];
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc];
[ud setObject:udObject forKey:@"myBusinessCard"];
[bc release];
udObject = nil;
udObject = [ud objectForKey:@"myBusinessCard"];
bc = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:udObject];
```
需要注意的是,在实现<NSCoding>协议时,需要确保对象的所有属性都可以被编码和解码。如果对象中包含另一个自定义对象,需要确保该对象也实现了<NSCoding>协议。
使用NSUserDefaults存储自定义对象需要实现<NSCoding>协议,并将对象编码到NSData中,然后存储到NSUserDefaults中。在读取时,需要将NSData解码回自定义对象。