欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-18 14:52:04
ios 中nsuserdefaults读取和写入自定义对象的实现方法 nsuserdefaults可以存取一些短小的信息。 比如存入再读出一个字符串到nsuserdef...

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>。

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

上一篇:

下一篇: