一、使用XML属性列表归档

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

 #import <Foundation/Foundation.h>

 int main(int argc, const char * argv[])
{ @autoreleasepool {
//生成字典dic,并将字典dic写到xml文件myFirstDic文件
NSDictionary *dic = @{@"wukong": @"so smart", @"ranHanLu": @"so beautiful", @"family": @"best importtant!"};
if ([dic writeToFile: @"myFirstDic" atomically:YES] == NO) {
NSLog(@"Write to file failed");
} //读取
dic = [NSDictionary dictionaryWithContentsOfFile: @"myFirstDic"];
for (NSString *key in dic) {
NSLog(@"key is: %@, value is : %@", key, dic[key]);
}
}
return ;
}

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

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

 #import <Foundation/Foundation.h>

 int main(int argc, const char * argv[])
{ @autoreleasepool {
//适用NSKeyedUnarchiver类中得archiveRootObject:方法存储字典 NSDictionary *dic = @{
@"wukong": @"so smart", @"ranHanLu": @"so beautiful", @"archive": @"ending...."
};
[NSKeyedArchiver archiveRootObject: dic toFile: @"dic.archive"]; //读取
NSDictionary *new;
new = [NSKeyedUnarchiver unarchiveObjectWithFile: @"dic.archive"];
for (NSString *key in new) {
NSLog(@"key is: %@, value is : %@", key, new[key]);
} }
return ;
}

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

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

 #import <Foundation/Foundation.h>

 @interface testClass: NSObject

 @property (copy, nonatomic) NSString *name, *address;
@end @implementation testClass
//添加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;
}
@synthesize name, address; @end
int main(int argc, const char * argv[])
{ @autoreleasepool {
testClass *myTest = [[testClass alloc] init]; myTest.name = @"wukong";
myTest.address = @"sichuan";
//归档
[NSKeyedArchiver archiveRootObject: myTest toFile: @"myTest.archive"];
//读出
myTest = [NSKeyedUnarchiver unarchiveObjectWithFile: @"myTest.archive"];
NSLog(@"Name is : %@, address is : %@", myTest.name, myTest.address); }
return ;
}

四、使用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: @""];
[mybook addAddressCard: card1];
//存档对象
[archiver encodeObject: myTest forKey: @"MyTest"];
[archiver encodeObject: mybook forKey: @"MyBook"];
//表明存档结束
[archiver finishEncoding];
//将存档数据写入指定文件
if ([mutableData writeToFile: @"firstDataArchive" atomically:YES] == NO) {
NSLog(@"\nArchive Failed");
} //从指定文件读取存档数据
data = [NSData dataWithContentsOfFile: @"firstDataArchive"];
//指定从data区解码
unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; //解码开始
myTest = [unArchiver decodeObjectForKey: @"MyTest"];
mybook = [unArchiver decodeObjectForKey: @"MyBook"];
//显示
[mybook list];
}
return ;
}

  1.1 AddressCard类(interface)

 #import <Foundation/Foundation.h>

 @interface AddressCard : NSObject
@property (copy, nonatomic) NSString *firstName, *lastName, *email, *address, *phoneNumber;
-(void) setName: (NSString *) theName;
-(void) setEmail: (NSString *) theEmail;
-(void) setFirstName: (NSString *) theFirstName setLastName: (NSString *) theLastName setEmail: (NSString *) theEmail setAddress: (NSString *) theAddress setPhoneNumber: (NSString *) thePhoneNumber;
-(NSString *) name;
-(NSString *) email;
-(void) print;
-(BOOL) isEqual: (AddressCard *) theCard;
-(NSComparisonResult) compareName: (AddressCard *) theCard;
-(NSComparisonResult) check: (AddressCard *) theCard;
@end

  1.2 AddressCard类 (implementation)

 #import "AddressCard.h"

 @implementation AddressCard

 @synthesize firstName, lastName, email, phoneNumber, address;

 -(void) setFirstName: (NSString *) theFirstName setLastName: (NSString *)theLastName setEmail: (NSString *) theEmail setAddress: (NSString *) theAddress setPhoneNumber: (NSString *) thePhoneNumber
{
firstName = theFirstName;
lastName = theLastName;
email = theEmail;
address = theAddress;
phoneNumber = thePhoneNumber;
} -(void) print
{
NSLog(@"\n%@ %@ %@ %@ %@",firstName, lastName, email, address, phoneNumber);
} -(BOOL) isEqual: (AddressCard *) theCard
{
if ([firstName isEqualToString: theCard.firstName] && [email isEqualToString: theCard.email] && [lastName isEqualToString: theCard.lastName]) {
return YES;
}else{
return NO;
}
} -(NSComparisonResult) compareName: (AddressCard *) theCard
{
//return [name compare: theCard.name];
return [theCard.firstName compare: firstName];
} -(NSComparisonResult) check: (AddressCard *) theCard
{
return [theCard.lastName compare: lastName];
} -(void) encodeWithCoder: (NSCoder *) encoder
{
[encoder encodeObject: firstName forKey: @"addressCardFirstname"];
[encoder encodeObject: lastName forKey: @"addressCardLastname"];
[encoder encodeObject: email forKey: @"addressCardEmail"];
[encoder encodeObject: phoneNumber forKey: @"addressCardPhoneNumber"]; } -(id) initWithCoder: (NSCoder *) decoder
{
firstName = [decoder decodeObjectForKey:@"addressCardFirstname"];
lastName = [decoder decodeObjectForKey:@"addressCardLastname"];
email = [decoder decodeObjectForKey:@"addressCardEmail"];
phoneNumber = [decoder decodeObjectForKey:@"addressCardPhoneNumber"];
return self;
}
@end

  2.1 AddressBook类 (interface类)

 #import <Foundation/Foundation.h>
#import "AddressCard.h"
@interface AddressBook : NSObject
@property (copy, nonatomic) NSString *bookName;
@property (nonatomic, strong) NSMutableArray *book; -(instancetype) initWithName: (NSString *) name;
-(void) addAddressCard: (AddressCard *) theCard;
-(int) entries;
-(void) list;
-(AddressCard *) lookUp: (NSString *) name;
-(NSMutableArray *) lookUpAll: (NSString *) name;
-(void) removeCard: (AddressCard *) theCard;
-(void) sortByName;
-(NSArray *) sortBySelector;
-(BOOL) removeByLastName: (NSString *) lastName;
@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

  

Foundation 框架 归档的更多相关文章

  1. Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver

    ========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...

  2. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

  3. Foundation框架-NSString和NSMutableString

    可变与不可变的字符串 --1-- Foundation框架介绍 1.1 框架介绍 --2-- NSString 2.1 NSString介绍及使用 2.2 NSString创建方式  2.3 从文件中 ...

  4. 08OC之Foundation框架

    1.Foundation框架简述 在前面,我们创建一个类的时候,都会选择Cocoa Class.到底Cocoa Class是什么东西呢? Cocoa 不是一门编程语言,因为它可以运行在多种编程语言上, ...

  5. iOS - OC Foundation 框架

    前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 ...

  6. iOS - Swift Foundation 框架

    前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 ...

  7. iOS Foundation 框架概述文档:常量、数据类型、框架、函数、公布声明

    iOS Foundation 框架概述文档:常量.数据类型.框架.函数.公布声明 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业 ...

  8. OC中Foundation框架

    框架的概念 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的组合,以便使研发程序变的更容易在OS X下地Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation框架 ...

  9. 79、iOS 的Cocoa框架、Foundation框架以及UIKit框架

    Cocoa框架是iOS应用程序的基础 1. Cocoa是什么? Cocoa是 OS X和ios 操作系统的程序的运行环境. 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发 ...

随机推荐

  1. HTML 5 drag and drop 简介

    Html 5 drag and drop 简介 HTML5提供了专门拖拽和拖放的API draggable属性 启用拖拽 draggable属性是否可被拖拽, 可选值: true, false, au ...

  2. TLSAlloc()

    为什么要有TLS?原因在于,进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量.在一个线程修改的内存内容,对所有线程都生效.这是一个优点也是一个缺点.说它是优点,线 ...

  3. Android 获取屏幕分辨率

    原文:Android 获取屏幕分辨率 得到一个屏幕尺寸的三种方法如下:        // 通过WindowManager获取        DisplayMetrics dm = new Displ ...

  4. [原]容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...

  5. poj2656---求一列数中最大数的序数而且在前面输入的更优先

    #include<stdio.h> #include<stdlib.h> int main() { int n,i; while(scanf("%d",&a ...

  6. [LeetCode][Python]Reverse Integer

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/reverse ...

  7. 面向对象程序设计-C++_课时24多态的实现

    所有带virtual的类的对象,里面最上面有一个隐藏的指针vptr,指向一张表vtable #include <iostream> using namespace std; class A ...

  8. nodejs开发微信1——微信路由设置a(access_token和tickets)

    /* jshint -W079 */ /* jshint -W020 */ "use strict"; var _ = require("lodash"); v ...

  9. Ubuntu14.04 Server Apache2+subversion环境搭建

    自从工作后,发现之前的代码开发太随便啦,于是经过不到两年的工作积累,打算在自己开发软件的过程中好好管理自己的项目.于是打算搭建自己的项目服务器,去年搭建过一次,但是由于没有记录,现在需要再来一遍,好多 ...

  10. Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI

    1.概述 哈,今天给大家带来一个ViewPagerIndicator的制作,相信大家在做tabIndicator的时候,大多数人都用过 TabPageIndicator,并且很多知名APP都使用过这个 ...