国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

剖析Objective-C持久化教程

移動開發(fā) iOS
本文介紹的是剖析Objective-C持久化教程,主要談?wù)揙bjective-C持久化的問題,我們來看內(nèi)容。

剖析Objective-C持久化教程是本文要介紹的內(nèi)容,很詳細(xì)的講解了Objective-C持久化的問題,不多說,我們來看內(nèi)容。

當(dāng)前需求

在做登錄模塊時,需要做登錄的歷史記錄,存儲本機(jī)所有登錄的用戶的用戶名密碼,以及登錄策略如是否記住密碼,是否自動登錄等。具體實(shí)現(xiàn)之前,我認(rèn)為這個需求看樣子并不需要SQLite,因?yàn)榈卿浻脩舨豢赡芴啵掖鎯Φ淖侄我簿退膫€而已,估計用NSUserDefaults存一下數(shù)組就結(jié)了。

初遇困難

令我沮喪的是,這么一個明確的需求竟然一時半會都沒有完成,用戶登陸信息明明很簡單的

Objective-c代碼 

  1. @interface LoginUserInfo : NSObject     
  2. {     
  3.     NSString *username_;     
  4.     NSString *password_;     
  5.     BOOL     remember_;     
  6.     BOOL     autoLogin_;     
  7. }     
  8.     
  9. @property (nonatomic, copy) NSString *username;     
  10. @property (nonatomic, copy) NSString *password;     
  11. @property (nonatomic, assign) BOOL remember;     
  12. @property (nonatomic, assign) BOOL autoLogin;     
  13. @end     
  14.       
  15. @protocol LoginHistoryDelegate;    
  16.  
  17. @interface LoginUserInfo : NSObject  
  18. {  
  19.     NSString *username_;  
  20.     NSString *password_;  
  21.     BOOL     remember_;  
  22.     BOOL     autoLogin_;  
  23. }  
  24.  
  25. @property (nonatomic, copy) NSString *username;  
  26. @property (nonatomic, copy) NSString *password;  
  27. @property (nonatomic, assign) BOOL remember;  
  28. @property (nonatomic, assign) BOOL autoLogin;  
  29. @end  
  30.    
  31. @protocol LoginHistoryDelegate;   

存取的時候也很簡單

Objective-c代碼  

  1. // 增加一個用戶要看是否是新用戶,如果是新的就增加,否則要修改     
  2. - (void)addUser:(LoginUserInfo *)info     
  3. {     
  4.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];     
  5.     NSArray *list = [self getUserList];     
  6.     NSArray *newList = nil;     
  7.     if (list == nil)     
  8.     {     
  9.         newList = [NSArray arrayWithObject:info];     
  10.     }     
  11.     else     
  12.     {     
  13.         NSMutableArray *mutList = [[NSMutableArray alloc] initWithCapacity:[list count]+1];     
  14.         [mutList addObject:info];     
  15.         for (LoginUserInfo *user in list)     
  16.         {     
  17.             if (![[info username] isEqualToString:[user username]])     
  18.             {     
  19.                 [mutList addObject:user];     
  20.             }     
  21.         }     
  22.         newList = [mutList mutableCopy];     
  23.     }     
  24.     [defaults setObject:newList forKey:kUserHistoryKey];     
  25.     [defaults synchronize];     
  26.     [newList release];     
  27. }     
  28.     
  29. - (NSArray *)getUserList     
  30. {     
  31.     NSArray *objectArray = [[NSUserDefaults standardUserDefaults]  objectForKey:kUserHistoryKey];     
  32.     return objectArray;     
  33. }    
  34.  
  35. // 增加一個用戶要看是否是新用戶,如果是新的就增加,否則要修改  
  36. - (void)addUser:(LoginUserInfo *)info  
  37. {  
  38.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  39.     NSArray *list = [self getUserList];  
  40.     NSArray *newList = nil;  
  41.     if (list == nil)  
  42.     {  
  43.         newList = [NSArray arrayWithObject:info];  
  44.     }  
  45.     else  
  46.     {  
  47.         NSMutableArray *mutList = [[NSMutableArray alloc] initWithCapacity:[list count]+1];  
  48.         [mutList addObject:info];  
  49.         for (LoginUserInfo *user in list)  
  50.         {  
  51.             if (![[info username] isEqualToString:[user username]])  
  52.             {  
  53.                 [mutList addObject:user];  
  54.             }  
  55.         }  
  56.         newList = [mutList mutableCopy];  
  57.     }  
  58.     [defaults setObject:newList forKey:kUserHistoryKey];  
  59.     [defaults synchronize];  
  60.     [newList release];  
  61. }  
  62.  
  63. - (NSArray *)getUserList  
  64. {  
  65.     NSArray *objectArray = [[NSUserDefaults standardUserDefaults]  objectForKey:kUserHistoryKey];  
  66.     return objectArray;  

但這樣無論我怎么存儲用戶列表,在getUserList的時候獲得的始終是nil。

各種嘗試

難道是NSUserdefaults有問題么?我試了試在同個方法里改為存儲普通的int,bool,甚至NSString都沒問題,難道是因?yàn)闆]有存儲數(shù)組么

Objective-c代碼 

  1. NSArray *arr = [NSArray arrayWithObjects:@"xixi", @"haha", nil];     
  2.     [[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"Array"];     
  3.     [[NSUserDefaults standardUserDefaults] synchronize];     
  4.      NSArray *arr2 = [[NSUserDefaults standardUserDefaults] objectForKey:@"Array"];     
  5.     NSString *s1 = [arr2 objectAtIndex:0];     
  6.     NSLog(@"%@", s1);    
  7.  
  8. NSArray *arr = [NSArray arrayWithObjects:@"xixi", @"haha", nil];  
  9.     [[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"Array"];  
  10.     [[NSUserDefaults standardUserDefaults] synchronize];  
  11.      NSArray *arr2 = [[NSUserDefaults standardUserDefaults] objectForKey:@"Array"];  
  12.     NSString *s1 = [arr2 objectAtIndex:0];  
  13.     NSLog(@"%@", s1);  

但此時仍然可以很順利的顯示出s1為xixi 沒辦法只好上網(wǎng)找資料了,這時注意到我存儲的是自定義的結(jié)構(gòu),而和java的序列化類似,在序列化自定義類型的時候,必須要滿足可序列化的一系列條件,甚至包括序列化的規(guī)則,就Objective-C而言,必須要實(shí)現(xiàn)NSCoding協(xié)議

Objective-c代碼 

  1. - (void)encodeWithCoder:(NSCoder *)coder;     
  2. {     
  3.     [coder encodeObject:username_ forKey:@"username"];     
  4.     [coder encodeObject:password_ forKey:@"password"];     
  5.     [coder encodeBool:remember_ forKey:@"remember"];     
  6.     [coder encodeBool:autoLogin_ forKey:@"autologin"];     
  7. }     
  8.       
  9. - (id)initWithCoder:(NSCoder *)coder;     
  10. {     
  11.     self = [[LoginUserInfo alloc] init];     
  12.     if (self != nil)     
  13.     {     
  14.         self.username = [coder decodeObjectForKey:@"username"];     
  15.         self.password = [coder decodeObjectForKey:@"password"];     
  16.         self.remember = [coder decodeBoolForKey:@"remember"];     
  17.         self.autoLogin = [coder decodeBoolForKey:@"autologin"];     
  18.     }     
  19.         
  20.     return self;     
  21. }    
  22.  
  23. - (void)encodeWithCoder:(NSCoder *)coder;  
  24. {  
  25.     [coder encodeObject:username_ forKey:@"username"];  
  26.     [coder encodeObject:password_ forKey:@"password"];  
  27.     [coder encodeBool:remember_ forKey:@"remember"];  
  28.     [coder encodeBool:autoLogin_ forKey:@"autologin"];  
  29. }  
  30.    
  31. - (id)initWithCoder:(NSCoder *)coder;  
  32. {  
  33.     self = [[LoginUserInfo alloc] init];  
  34.     if (self != nil)  
  35.     {  
  36.         self.username = [coder decodeObjectForKey:@"username"];  
  37.         self.password = [coder decodeObjectForKey:@"password"];  
  38.         self.remember = [coder decodeBoolForKey:@"remember"];  
  39.         self.autoLogin = [coder decodeBoolForKey:@"autologin"];  
  40.     }  
  41.      
  42.     return self;  
  43. }   

然后在存取的時候再加上序列化以及反序列化的代碼

Objective-c代碼 

  1. - (NSArray *)getUserList     
  2. {     
  3.     NSArray *objectArray = nil;     
  4.     NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kUserHistoryKey];     
  5.     if (data != nil)     
  6.     {     
  7.         NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];     
  8.         if (oldSavedArray != nil)     
  9.             objectArray = [[NSArray alloc] initWithArray:oldSavedArray];     
  10. //        else     
  11. //            objectArray = [[NSMutableArray alloc] init];     
  12.     }     
  13.     return objectArray;     
  14. }     
  15.     
  16. // 增加一個用戶要看是否是新用戶,如果是新的就增加,否則要修改     
  17. - (void)addUser:(LoginUserInfo *)info     
  18. {     
  19.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];     
  20.     NSArray *list = [self getUserList];     
  21.     NSArray *newList = nil;     
  22.     if (list == nil)     
  23.     {     
  24.         newList = [NSArray arrayWithObject:info];     
  25.     }     
  26.     else     
  27.     {     
  28.         NSMutableArray *mutList = [[NSMutableArray alloc] initWithCapacity:[list count]+1];     
  29.         [mutList addObject:info];     
  30.         for (LoginUserInfo *user in list)     
  31.         {     
  32.             if (![[info username] isEqualToString:[user username]])     
  33.             {     
  34.                 [mutList addObject:user];     
  35.             }     
  36.         }     
  37.         newList = [mutList mutableCopy];     
  38.     }     
  39.     [defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:     
  40. newList] forKey:kUserHistoryKey];     
  41.     [defaults synchronize];     
  42.     [newList release];     
  43. }    
  44.  
  45. - (NSArray *)getUserList  
  46. {  
  47.     NSArray *objectArray = nil;  
  48.     NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kUserHistoryKey];  
  49.     if (data != nil)  
  50.     {  
  51.         NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];  
  52.         if (oldSavedArray != nil)  
  53.             objectArray = [[NSArray alloc] initWithArray:oldSavedArray];  
  54. //        else  
  55. //            objectArray = [[NSMutableArray alloc] init];  
  56.     }  
  57.     return objectArray;  
  58. }  
  59.  
  60. // 增加一個用戶要看是否是新用戶,如果是新的就增加,否則要修改  
  61. - (void)addUser:(LoginUserInfo *)info  
  62. {  
  63.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  64.     NSArray *list = [self getUserList];  
  65.     NSArray *newList = nil;  
  66.     if (list == nil)  
  67.     {  
  68.         newList = [NSArray arrayWithObject:info];  
  69.     }  
  70.     else  
  71.     {  
  72.         NSMutableArray *mutList = [[NSMutableArray alloc] initWithCapacity:[list count]+1];  
  73.         [mutList addObject:info];  
  74.         for (LoginUserInfo *user in list)  
  75.         {  
  76.             if (![[info username] isEqualToString:[user username]])  
  77.             {  
  78.                 [mutList addObject:user];  
  79.             }  
  80.         }  
  81.         newList = [mutList mutableCopy];  
  82.     }  
  83.     [defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:  
  84. newList] forKey:kUserHistoryKey];  
  85.     [defaults synchronize];  
  86.     [newList release];  

這樣,總算可以持久化自定義結(jié)構(gòu)了

和其他類似的語言一樣,基礎(chǔ)的序列化是個說大不大,說小不小的步驟,如果用純c的話,就可以要完全自己去存儲每個字節(jié)再讀出每個字節(jié)然后解釋出來,而現(xiàn)代語言基本上都做好了常見類型的持久化,包括更復(fù)雜的內(nèi)置結(jié)構(gòu)。

但即便如此,編譯器也絕無可能理解用戶自定義的結(jié)構(gòu),就像java里的 transient標(biāo)注,還有持久化中內(nèi)嵌持久化結(jié)構(gòu),持久化時的變量先后依賴關(guān)系等,持久化在網(wǎng)絡(luò)中的傳輸?shù)鹊鹊鹊龋@也遠(yuǎn)遠(yuǎn)超過了本文的范疇 objective-c的困難支持可能要加上一個內(nèi)存的釋放方法不一等,確實(shí)很難便利的持久化

小結(jié):剖析Objective-C持久化教程的內(nèi)容介紹完了,希望本文對你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-19 15:15:09

Objective-C 內(nèi)存

2011-07-21 09:42:27

Objective-C 內(nèi)存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS內(nèi)存管理系統(tǒng)自動創(chuàng)建新的aut

2013-04-11 14:32:00

Objective-CiOS開發(fā)內(nèi)存管理@synthesize

2011-07-18 17:14:16

Objective-C 內(nèi)存 Cocoa

2011-07-08 13:49:46

Objective-C UUID

2011-08-05 14:03:39

Objective-C 對象 模板

2013-04-11 14:16:57

Objective-CiOS開發(fā)內(nèi)存管理

2011-08-22 09:48:16

WindowsObjective-C

2011-08-01 13:32:07

Objective-C Sqlite3 框架

2011-07-29 16:08:31

Objective-C 內(nèi)存

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2013-04-11 13:57:27

Objective-CiOS開發(fā)內(nèi)存管理

2011-08-10 18:07:29

Objective-C反射

2013-06-20 10:40:32

Objective-C實(shí)現(xiàn)截圖

2013-03-27 12:54:00

iOS開發(fā)Objective-C

2011-05-11 11:20:26

Objective-C

2011-05-11 15:58:34

Objective-C

2011-08-17 09:55:45

Objective-CCategory

2011-07-25 17:31:49

iPhone Objective-
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

麻豆一区二区三区四区精品蜜桃| 欧美日韩在线资源| 羞羞答答国产精品www一本| 久久久精品久久| 毛片网站在线免费观看| 午夜视频一区在线观看| www.亚洲天堂网| 国产精品亚洲成人| 日韩在线电影一区| 亚洲中字黄色| 精品日本一区二区三区| 久久精品av| 国产精品久久久久av| 偷拍自拍亚洲色图| 97香蕉超级碰碰久久免费软件| 国产美女亚洲精品7777| 色噜噜久久综合伊人一本| 高清不卡av| 国产一区二区三区视频| 625成人欧美午夜电影| 精品久久久久久最新网址| youjizz在线播放| 欧美精品电影在线播放| 风间由美一区| 欧美日韩小视频| 美女羞羞视频在线观看| 欧美老人xxxx18| 人妖欧美1区| 精品一区二区三区四区| 久久电影tv| 日韩视频免费在线观看| 国产一区精品二区| 青青草成人在线| 亚洲mv大片欧洲mv大片| 精品免费视频123区| 秋霞电影网一区二区| 99er在线视频| 久久久久久久久岛国免费| free性欧美1819hd| 日本道在线观看一区二区| 18视频在线观看网站| 国产亚洲视频在线观看| 2020最新国产精品| 国产成人一区二区| 亚洲欧洲一级| 国产精品一二三在线观看| 91丨porny丨户外露出| 九色视频一区| 5858s免费视频成人| 国产乱码午夜在线视频 | 黑人糟蹋人妻hd中文字幕| 久久―日本道色综合久久| 91麻豆福利| 欧美视频在线观看一区二区| а√天堂中文在线资源8| 欧美美最猛性xxxxxx| 久久久久久久久久久9不雅视频 | 秋霞综合在线视频| av观看久久| 国产精品白丝av| 调教视频vk| 日韩一区二区在线观看| 国产亚洲观看| 国产91一区二区三区| 国产久卡久卡久卡久卡视频精品| 先锋在线亚洲| 在线不卡中文字幕| 99久久久国产| 国产精品.com| 99国产精品久久久| 你懂的免费在线观看| 国产一区二区三区免费视频| 北条麻妃国产九九九精品小说| 亚洲高清精品中出| 亚洲欧美日韩国产成人精品影院 | 亚洲自拍偷拍图区| 免费看电影在线| 欧美亚洲国产日本| 蜜臀久久99精品久久久画质超高清| 黄色免费视频大全| 色av成人天堂桃色av| 国产高清精品二区| 欧美日韩精品免费看| 久久久99免费| 先锋影音在线资源站91| 欧美一级大胆视频| 狠狠色丁香婷婷综合| 情趣网站在线观看| 欧美精品生活片| 日韩激情一二三区| 在线观看的av网站| 欧美激情网站在线观看| 日本欧美一区二区在线观看| 新的色悠悠久久久| 欧美二区在线播放| 麻豆精品蜜桃视频网站| 台湾av在线二三区观看| 欧美精品激情blacked18| 久久机这里只有精品| 成人精品一区二区| 久久久久久成人精品| 麻豆免费看一区二区三区| 日本亚洲一区| 日产精品99久久久久久| 成人国产亚洲欧美成人综合网| a√资源在线| 国产精品日韩欧美| 国产精品另类一区| vam成人资源在线观看| 青春草在线视频免费观看| 欧美日韩午夜在线视频| 手机亚洲手机国产手机日韩| 特级丰满少妇一级| 北条麻妃久久精品| 国产精品18久久久久久久网站| 中文字幕资源网在线观看| 亚洲qvod图片区电影| 亚洲国产精品视频| 精品欠久久久中文字幕加勒比| 日韩xxxx视频| 一区二区日韩精品| 国产成人啪午夜精品网站男同| 欧美hdxxx| 亚洲精品成人a8198a| 欧美另类变人与禽xxxxx| 中文在线播放一区二区| 中文在线√天堂| 国产精品影片在线观看| 国产精品美女视频| 狠狠久久伊人| 婷婷免费在线观看| 色在人av网站天堂精品| 国产视频在线观看一区二区三区| av一级久久| 黄大色黄女片18第一次| 久久噜噜噜精品国产亚洲综合 | 欧美在线综合视频| 欧美hentaied在线观看| 青檬在线电视剧在线观看| 国产精品人成电影在线观看| 亚洲福利视频一区| 亚洲色图网站| 日本综合在线| 视频二区一区| 一区二区三区国产视频| av在线播放不卡| 午夜日韩影院| 四虎黄色影院| 国产精品igao视频| 午夜激情一区二区三区| 在线成人国产| 极品av在线| 丝袜老师办公室里做好紧好爽| 欧美激情亚洲激情| 一区二区三区小说| 亚洲大黄网站| 成人av影院在线观看| 日韩精品免费一区| 欧美国产日韩一区| 亚洲成人免费影院| 国产日韩欧美| 91精品店在线| 欧美aaa大片| 久久99热只有频精品91密拍| 亚洲美女喷白浆| 国产精品久久久久久久蜜臀| 亚洲国产一区二区在线观看| а√天堂资源地址在线下载| 日本高清xxxx| 欧美又大粗又爽又黄大片视频| 色综合网色综合| 国产一区二区三区香蕉| 嗯用力啊快一点好舒服小柔久久| 中文在线中文字幕| 夜夜爽99久久国产综合精品女不卡 | 欧美 日韩 国产 在线观看| 在线视频国产日韩| 一区二区三区中文在线| 亚洲三级毛片| 国产高清亚洲| 91短视频版在线观看www免费| 色一情一乱一乱一区91| 欧美在线亚洲在线| 666欧美在线视频| 久久影院视频免费| 亚洲国产片色| 榴莲视频成人app| 国产精品ⅴa有声小说| 影音先锋成人资源网站| 国产精品久久久久久久久久| 精品久久国产97色综合| 中文字幕日韩一区| 日本亚洲视频在线| 欧美日韩在线二区| 日韩一级二级| 91啦中文在线| 97干com| 日韩国产一级片| 久久影视中文粉嫩av| 欧美性资源免费|