溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

IOS如何實(shí)現(xiàn)NSUserDefaults讀取和寫(xiě)入自定義對(duì)象

發(fā)布時(shí)間:2021-07-08 14:32:57 來(lái)源:億速云 閱讀:122 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

小編給大家分享一下IOS如何實(shí)現(xiàn)NSUserDefaults讀取和寫(xiě)入自定義對(duì)象,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

IOS 中NSUserDefaults讀取和寫(xiě)入自定義對(duì)象的實(shí)現(xiàn)方法

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

比如存入再讀出一個(gè)字符串到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.

 如果把一個(gè)自定義的類存到一個(gè)NSArray里,然后再存到NSUserDefaults里也是不能成功的。不信可以試試,如果你成功的請(qǐng)告訴我。

那怎么辦呢? 

我找到的方法是,讓這個(gè)自定義類實(shí)現(xiàn)<NSCoding>協(xié)議中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的協(xié)議protocol就是java的接口interface,就是C++的純虛函數(shù)),然后把該自定義的類對(duì)象編碼到NSData中,再?gòu)腘SUserDefaults中進(jìn)行讀取。

粘代碼:

假設(shè)有這樣一個(gè)簡(jiǎn)單的類對(duì)象

@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

然后再存取時(shí)通過(guò)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] ;

以上的代碼時(shí)由另一個(gè)程序中截取的,沒(méi)有測(cè)試過(guò),但意思就是這樣了。

如果一個(gè)自定義類中由另一個(gè)自定義類對(duì)象,那么所有嵌套的類都要實(shí)現(xiàn)<NSCoding>。

以上是“IOS如何實(shí)現(xiàn)NSUserDefaults讀取和寫(xiě)入自定義對(duì)象”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI