1. 程式人生 > >IOS歸解檔

IOS歸解檔

原文連結:http://blog.csdn.net/richard_rufeng/article/details/17640551

歸檔也叫序列化,是將檔案存在硬碟,解檔是從硬碟還原

5種方式:

第一種、使用屬性列表進行歸檔

如果物件是NSString,NSDictionary,NSArray,NSData或者NSNumber,可以使用writeToFile:atomically方法將資料寫到檔案,注意這種方式是明文

sample:

[objc] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. NSArray *array = @[@"abc",@"123",@23.4];  
  2. if
     ([array writeToFile:@"text.plist" atomically:YES])  
  3. {  
  4.     NSLog(@"success");  
  5. }  
  6. NSArray *arr2=[NSArray arrayWithContentsOfFile:@"text.plist"];  
  7. NSLog(@"%@",arr2);  

第二、NSKeyedArchiver--物件歸檔,資料會加密

1、對於NSArray或者NSDictionary sample code:

[objc] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. /***歸檔物件****/
  2.  NSArray
     *array = @[@"abc",@"123",@23.4];  
  3.  NSString *homePath = NSHomeDirectory();  
  4.  NSString *path = [homePath stringByAppendingPathComponent:@"test.arc"];  
  5. // BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:path];
  6.  BOOL success=[NSKeyedArchiver archiveRootObject:array toFile:path];  
  7.  if (success) {  
  8.      NSLog(@"archive success");  
  9.  }  
  10.  /***解歸檔****/
  11.  NSArray *array2 =[NSKeyedUnarchiver unarchiveObjectWithFile:path];  
  12. SLog(@"%@",array2);  

結果:

success

2013-12-28 22:14:25.353 ArchiverDemo1[1206:303] (

    abc,

    123,

    "23.4"

)

2、如果是其他型別的物件儲存到檔案,可以利用NSKeyedArchiver類建立帶鍵的檔案來完成

[objc] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. NSString *homePath = NSHomeDirectory();  
  2. NSString *path = [homePath stringByAppendingPathComponent:@"archiver2.archiv"];  
  3. NSMutableData *data = [NSMutableData data];  
  4. NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];  
  5. NSArray *array = @[@"jack",@"tom"];  
  6. [archiver encodeInt:100 forKey:@"age"];  
  7. [archiver encodeObject:array forKey:@"names"];  
  8. [archiver finishEncoding];  
  9. [archiver release];  
  10. BOOL success = [data writeToFile:path atomically:YES];  
  11. if (success) {  
  12.     NSLog(@"archive success");  
  13. }  
  14. /***解歸檔物件**/
  15. NSData *data2 = [NSData dataWithContentsOfFile:path];  
  16. NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data2];  
  17. int age = [unArchiver decodeIntForKey:@"age"];  
  18. NSArray *names = [unArchiver decodeObjectForKey:@"names"];  
  19. [unArchiver release];  
  20. NSLog(@"age=%d,names=%@",age,names);  
3、自定義物件進行歸檔,需要實現歸檔協議NSCoding兩個方法

對屬性編碼,歸檔的時候會呼叫

- (void)encodeWithCoder:(NSCoder *)aCoder

//對屬性解碼,解歸檔呼叫

- (id)initWithCoder:(NSCoder *)aDecoder 

[objc] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. //對屬性編碼,歸檔的時候會呼叫
  2. - (void)encodeWithCoder:(NSCoder *)aCoder {  
  3.     [aCoder encodeInt:_age forKey:AGE];  
  4.     [aCoder encodeObject:_name forKey:NAME];  
  5.     [aCoder encodeObject:_email forKey:EMAIL];  
  6.     [aCoder encodeObject:_password forKey:PASSWORD];  
  7. }  
  8. //對屬性解碼,解歸檔呼叫
  9. - (id)initWithCoder:(NSCoder *)aDecoder {  
  10.     self = [super init];  
  11.     if (self != nil) {  
  12.         _age = [aDecoder decodeIntForKey:AGE];  
  13.         self.name = [aDecoder decodeObjectForKey:NAME];  
  14.         self.email = [aDecoder decodeObjectForKey:EMAIL];  
  15.         self.password = [aDecoder decodeObjectForKey:PASSWORD];  
  16.     }  
  17.     returnself;  
  18. }  


第三種:NSUserDefaults

sample code:

[objc] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. [[NSUserDefaults standardUserDefaults] setObject:authData forKey:@"SinaWeiboAuthData"];  
  2. [[NSUserDefaults standardUserDefaults] synchronize];  

第四種、SQlite資料庫、CoreData資料庫