• Foundation 框架 归档


    一、使用XML属性列表归档

      此方法适用于NSString、NSDictionary、NSarray、NSDate、NSnumber,其中atomically参数表示先将字典写入临时备份文件,成功之后,把最终数据写入到dic指定的文件中

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc, const char * argv[])
     4 {
     5 
     6     @autoreleasepool {
     7         //生成字典dic,并将字典dic写到xml文件myFirstDic文件
     8         NSDictionary *dic = @{@"wukong": @"so smart", @"ranHanLu": @"so beautiful", @"family": @"best importtant!"};
     9         if ([dic writeToFile: @"myFirstDic" atomically:YES] == NO) {
    10             NSLog(@"Write to file failed");
    11         }
    12         
    13         //读取
    14         dic = [NSDictionary dictionaryWithContentsOfFile: @"myFirstDic"];
    15         for (NSString *key in dic) {
    16             NSLog(@"key is: %@, value is : %@", key, dic[key]);
    17         }
    18     }
    19     return 0;
    20 }

    二、适用NSKeyedUnarchiver类中得archiveRootObject:方法存储字典

      此方法可直接用于将NSString、NSDictionary、NSarray、NSDate、NSnumber归档,要适用于所有对象,需要对重写encodeWithCoder和initWithCoder方法,见三

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc, const char * argv[])
     4 {
     5 
     6     @autoreleasepool {
     7         //适用NSKeyedUnarchiver类中得archiveRootObject:方法存储字典
     8         
     9         NSDictionary *dic = @{
    10                               @"wukong": @"so smart", @"ranHanLu": @"so beautiful", @"archive": @"ending...."
    11                               };
    12         [NSKeyedArchiver archiveRootObject: dic toFile: @"dic.archive"];
    13         
    14         //读取
    15         NSDictionary *new;
    16         new = [NSKeyedUnarchiver unarchiveObjectWithFile: @"dic.archive"];
    17         for (NSString *key in new) {
    18             NSLog(@"key is: %@, value is : %@", key, new[key]);
    19         }
    20         
    21     }
    22     return 0;
    23 }

     三、适用NSKeyedUnarchiver类中得archiveRootObject:方法,存储任意对象

      1.首先需要对自定义对象添加协议方法 1 #import <Foundation/Foundation.h>

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface testClass: NSObject
     4 
     5 @property (copy, nonatomic) NSString *name, *address;
     6 @end
     7 
     8 @implementation testClass
     9 //添加encodeWithCoder和initWithCoder方法
    10 -(void) encodeWithCoder: (NSCoder *) encoder
    11 {
    12     [encoder encodeObject: name forKey: @"testClassName"];
    13     [encoder encodeObject: address forKey: @"testClassAddress"];
    14 }
    15 
    16 -(id) initWithCoder: (NSCoder *) decoder
    17 {
    18     name = [decoder decodeObjectForKey: @"testClassName"];
    19     address = [decoder decodeObjectForKey: @"testClassAddress"];
    20     
    21     return self;
    22 }
    23 @synthesize name, address;
    24 
    25 @end
    26 int main(int argc, const char * argv[])
    27 {
    28 
    29     @autoreleasepool {
    30         testClass *myTest = [[testClass alloc] init];
    31         
    32         myTest.name = @"wukong";
    33         myTest.address = @"sichuan";
    34         //归档
    35         [NSKeyedArchiver archiveRootObject: myTest toFile: @"myTest.archive"];
    36         //读出
    37         myTest = [NSKeyedUnarchiver unarchiveObjectWithFile: @"myTest.archive"];
    38         NSLog(@"Name is : %@, address is : %@", myTest.name, myTest.address);
    39         
    40     }
    41     return 0;
    42 }

     四、使用NSData自定义归档

      此示例将会使用到AddressBook, AddressCard, 以及 myTest类。

      以下为程序主体:

      

    #import <Foundation/Foundation.h>
    #import "AddressBook.h"
    #import "AddressCard.h"
    @interface testClass: NSObject
    
    @property (copy, nonatomic) NSString *name, *address;
    @end
    
    @implementation testClass
    @synthesize name, address;
    //添加encodeWithCoder和initWithCoder方法
    -(void) encodeWithCoder: (NSCoder *) encoder
    {
        [encoder encodeObject: name forKey: @"testClassName"];
        [encoder encodeObject: address forKey: @"testClassAddress"];
    }
    
    -(id) initWithCoder: (NSCoder *) decoder
    {
        name = [decoder decodeObjectForKey: @"testClassName"];
        address = [decoder decodeObjectForKey: @"testClassAddress"];
        
        return self;
    }
    
    
    @end
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            //创建myTest实例
            testClass *myTest = [[testClass alloc] init];
            //创建myBook实例
            AddressBook *mybook = [[AddressBook alloc] init];
            //创建myCard实例
            AddressCard *card1 = [[AddressCard alloc] init];
            //创建NSMutableData实例,用于存放归档数据
            NSMutableData *mutableData = [NSMutableData data];
            //创建NSData用于读取归档数据
            NSData *data = [NSData data];
            //创建NSKeyedArchiver实例,并指定归档到mutableData
            NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: mutableData];
            //创建NSKeyedUnarchiver,用于读取归档数据
            NSKeyedUnarchiver *unArchiver;
            
            myTest.name = @"wukong";
            myTest.address = @"sichuan";
            [card1 setFirstName: @"sun" setLastName:@"wukong" setEmail:@"999@163.com" setAddress: @"huaGuoShan" setPhoneNumber: @"9999999"];
            [mybook addAddressCard: card1];
            //存档对象
            [archiver encodeObject: myTest forKey: @"MyTest"];
            [archiver encodeObject: mybook forKey: @"MyBook"];
            //表明存档结束
            [archiver finishEncoding];
            //将存档数据写入指定文件
            if ([mutableData writeToFile: @"firstDataArchive" atomically:YES] == NO) {
                NSLog(@"
    Archive Failed");
            }
            
            //从指定文件读取存档数据
            data = [NSData dataWithContentsOfFile: @"firstDataArchive"];
            //指定从data区解码
            unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
            
            //解码开始
            myTest = [unArchiver decodeObjectForKey: @"MyTest"];
            mybook = [unArchiver decodeObjectForKey: @"MyBook"];
            //显示
            [mybook list];
        }
        return 0;
    }

      1.1 AddressCard类(interface)

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface AddressCard : NSObject
     4 @property (copy, nonatomic) NSString *firstName, *lastName, *email, *address, *phoneNumber;
     5 -(void) setName: (NSString *) theName;
     6 -(void) setEmail: (NSString *) theEmail;
     7 -(void) setFirstName: (NSString *) theFirstName setLastName: (NSString *) theLastName setEmail: (NSString *) theEmail setAddress: (NSString *) theAddress setPhoneNumber: (NSString *) thePhoneNumber;
     8 -(NSString *) name;
     9 -(NSString *) email;
    10 -(void) print;
    11 -(BOOL) isEqual: (AddressCard *) theCard;
    12 -(NSComparisonResult) compareName: (AddressCard *) theCard;
    13 -(NSComparisonResult) check: (AddressCard *) theCard;
    14 @end

      1.2 AddressCard类 (implementation)

     1 #import "AddressCard.h"
     2 
     3 @implementation AddressCard
     4 
     5 @synthesize firstName, lastName, email, phoneNumber, address;
     6 
     7 -(void) setFirstName: (NSString *) theFirstName setLastName: (NSString *)theLastName setEmail: (NSString *) theEmail setAddress: (NSString *) theAddress setPhoneNumber: (NSString *) thePhoneNumber
     8 {
     9     firstName = theFirstName;
    10     lastName = theLastName;
    11     email = theEmail;
    12     address = theAddress;
    13     phoneNumber = thePhoneNumber;
    14 }
    15 
    16 
    17 -(void) print
    18 {
    19     NSLog(@"
    %@ %@ %@ %@ %@",firstName, lastName, email, address, phoneNumber);
    20 }
    21 
    22 -(BOOL) isEqual: (AddressCard *) theCard
    23 {
    24     if ([firstName isEqualToString: theCard.firstName] && [email isEqualToString: theCard.email] && [lastName isEqualToString: theCard.lastName]) {
    25         return YES;
    26     }else{
    27         return NO;
    28     }
    29 }
    30 
    31 -(NSComparisonResult) compareName: (AddressCard *) theCard
    32 {
    33     //return [name compare: theCard.name];
    34     return [theCard.firstName compare: firstName];
    35 }
    36 
    37 -(NSComparisonResult) check: (AddressCard *) theCard
    38 {
    39     return [theCard.lastName compare: lastName];
    40 }
    41 
    42 -(void) encodeWithCoder: (NSCoder *) encoder
    43 {
    44     [encoder encodeObject: firstName forKey: @"addressCardFirstname"];
    45     [encoder encodeObject: lastName forKey: @"addressCardLastname"];
    46     [encoder encodeObject: email forKey: @"addressCardEmail"];
    47     [encoder encodeObject: phoneNumber forKey: @"addressCardPhoneNumber"];
    48 
    49 }
    50 
    51 -(id) initWithCoder: (NSCoder *) decoder
    52 {
    53     firstName = [decoder decodeObjectForKey:@"addressCardFirstname"];
    54     lastName = [decoder decodeObjectForKey:@"addressCardLastname"];
    55     email = [decoder decodeObjectForKey:@"addressCardEmail"];
    56     phoneNumber = [decoder decodeObjectForKey:@"addressCardPhoneNumber"];
    57     return self;
    58 }
    59 @end

      2.1 AddressBook类 (interface类)

     1 #import <Foundation/Foundation.h>
     2 #import "AddressCard.h"
     3 @interface AddressBook : NSObject
     4 @property (copy, nonatomic) NSString *bookName;
     5 @property (nonatomic, strong) NSMutableArray *book;
     6 
     7 -(instancetype) initWithName: (NSString *) name;
     8 -(void) addAddressCard: (AddressCard *) theCard;
     9 -(int) entries;
    10 -(void) list;
    11 -(AddressCard *) lookUp: (NSString *) name;
    12 -(NSMutableArray *) lookUpAll: (NSString *) name;
    13 -(void) removeCard: (AddressCard *) theCard;
    14 -(void) sortByName;
    15 -(NSArray *) sortBySelector;
    16 -(BOOL) removeByLastName: (NSString *) lastName;
    17 @end

      2.2 AddressBook类 (implementation)

    #import "AddressBook.h"
    
    @implementation AddressBook
    @synthesize book, bookName;
    -(instancetype) initWithName: (NSString *) name
    {
        self = [super init];
        if (self) {
            bookName = [NSString stringWithString: name];
            book = [NSMutableArray array];
        }
        return  self;
    }
    
    -(instancetype) init{
        return [self initWithName: @"noName"];
    }
    
    -(void) addAddressCard: (AddressCard *) theCard
    {
        [book addObject: theCard];
    }
    
    -(int) entries
    {
        return (int)[book count];
    }
    
    -(void) list
    {
        for (AddressCard *theCard in book) {
            [theCard print];
        }
    }
    
    -(AddressCard *) lookUp: (NSString *) name
    {
        NSUInteger result = [book indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
            if ([[obj firstName] caseInsensitiveCompare: name] || [[obj lastName] caseInsensitiveCompare: name] || [[obj email] caseInsensitiveCompare:name]  || [[obj phoneNumber] caseInsensitiveCompare: name]) {
                *stop = YES;
                return YES;
            }else{
                return NO;
            }
        }];
        if (result != NSNotFound) {
            return book[result];
        }else{
            return nil;
        }
        /*NSUInteger result =  [book indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
            if ([[obj name] caseInsensitiveCompare: name] == NSOrderedSame ) {
                *stop = YES;
                return YES;
            }else{
                return NO;
            }
        }];
        if (result != NSNotFound) {
            return book[result];
        }else{
            return nil;
        }
         */
        /*
        for (AddressCard *theCard in book) {
            if ([theCard.name caseInsensitiveCompare: name] == NSOrderedSame) {
                return theCard;
            }
        }
        return Nil;
         */
    }
    
    //查看数组中得所有元素,并放到可变数组中返回
    -(NSMutableArray *) lookUpAll:(NSString *)name
    {
        
        NSMutableArray *matchs = [NSMutableArray array];
        NSIndexSet *all = [book indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
            if ([[obj name] rangeOfString: name].location == NSNotFound) {
                [matchs addObject: obj];
                return YES;
            }else{
                return NO;
            }
        }];
        
        if ([matchs count]) {
            return matchs;
        }else{
            return  nil;
        }
        
        /*
        NSMutableArray *matchs = [NSMutableArray array];
        NSIndexSet *all = [book indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
           if ([[obj name] compare: name] == NSOrderedSame) {
               [matchs addObject: obj];
               return YES;
           }else{
               return  NO;
           }
       }];
        
        if ([matchs count]) {
            return matchs;
        }else{
            return nil;
        }
         */
    }
    
    -(void) removeCard: (AddressCard *) theCard
    {
        [book removeObjectIdenticalTo: theCard];
        
    }
    
    -(void) sortByName
    {
    //    SEL s = @selector(compareName:);
    //    [book sortUsingSelector: s];
        [book sortUsingComparator:^(id obj1, id obj2) {
            return [[obj2 name] compare:  [obj1 name]];
        }];
    }
    
    -(NSArray *) sortBySelector
    {
        return [book sortedArrayUsingSelector: @selector(check:)];
    }
    
    -(BOOL) removeByLastName: (NSString *) lastName
    {
        NSUInteger result = [book indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
            if ([[obj lastName] caseInsensitiveCompare: lastName] == NSOrderedSame) {
                [book removeObject: obj];
                *stop = YES;
                return YES;
            }else{
                return NO;
            }
        }];
        if (result != NSNotFound) {
            return YES;
        }else{
            return NO;
        }
    }
    
    -(void) encodeWithCoder: (NSCoder *) encoder
    {
        [encoder encodeObject: book forKey: @"AddressBookBook"];
        [encoder encodeObject: bookName forKey: @"AddressBookName"];
    }
    
    -(id) initWithCoder: (NSCoder *) decoder
    {
        book = [decoder decodeObjectForKey: @"AddressBookBook"];
        bookName = [decoder decodeObjectForKey: @"AddressBookName"];
        return self;
    }
    @end

      

  • 相关阅读:
    UVa 291 The House Of Santa Claus——回溯dfs
    (优先)队列简单总结
    POJ 2255 Tree Recovery——二叉树的前序遍历、后序遍历、中序遍历规则(递归)
    博弈论入门 Bash 、Nim 、Wythoff's Game结论及c++代码实现
    UVa 167(八皇后)、POJ2258 The Settlers of Catan——记两个简单回溯搜索
    欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍
    51nod 1135 原根 (数论)
    「学习笔记」扩展KMP (简)
    「解题报告」[luoguP6594]换寝室 (二分答案 树形DP)
    「解题报告」[luoguP6585]中子衰变 (交互题 分类讨论)
  • 原文地址:https://www.cnblogs.com/pretty-guy/p/3958366.html
Copyright © 2020-2023  润新知