当前位置: 移动技术网 > 移动技术>移动开发>IOS > IOS 中NSUserDefaults读取和写入自定义对象的实现方法

IOS 中NSUserDefaults读取和写入自定义对象的实现方法

2019年07月24日  | 移动技术网移动技术  | 我要评论

ios 中nsuserdefaults读取和写入自定义对象的实现方法

nsuserdefaults可以存取一些短小的信息。

比如存入再读出一个字符串到nsuserdefaults:

nsstring *string = [nsstring stringwithstring @"hahaha"]; 
nsuserdefaults *ud = [nsuserdefaults standarduserdefaults]; 
[ud setobject:string forkey:@"mykey"]; 
nsstring *value; 
value = [ud objectforkey:"mykey"]; 
 

但是并不是所有的东西都能往里放的。nsuserdefaults只支持: nsstring, nsnumber, nsdate, nsarray, nsdictionary.

 如果把一个自定义的类存到一个nsarray里,然后再存到nsuserdefaults里也是不能成功的。不信可以试试,如果你成功的请告诉我。

那怎么办呢? 

我找到的方法是,让这个自定义类实现<nscoding>协议中的- (id) initwithcoder: (nscoder *)coder方法和- (void) encodewithcoder: (nscoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是c++的纯虚函数),然后把该自定义的类对象编码到nsdata中,再从nsuserdefaults中进行读取。

粘代码:

假设有这样一个简单的类对象

@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 

然后再存取时通过nsdata做载体:

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 unarchiveobjectwithdata:udobject] ; 

以上的代码时由另一个程序中截取的,没有测试过,但意思就是这样了。

如果一个自定义类中由另一个自定义类对象,那么所有嵌套的类都要实现<nscoding>。

如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网