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>。
如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!