/** 1:Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 2:tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 3:Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除 */ NSArray *paths1=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask , YES); NSString *documentsDirect=[paths1 objectAtIndex:0]; assert(1 == paths1.count); NSLog(@">>documentsDirect=%@",documentsDirect); NSArray *Librarypaths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSDocumentDirectory, YES); NSString* libraryDirectory = [Librarypaths objectAtIndex:0]; NSLog(@">>Librarypaths.length =%d",[Librarypaths count]); assert(1 < Librarypaths.count); NSLog(@"libraryDirectory=%@",libraryDirectory); //如果要指定其他文件目录,比如Caches目录,需要更换目录工厂常量,上面代码其他的可不变 NSArray *pathcaches=NSSearchPathForDirectoriesInDomains(NSCachesDirectory , NSUserDomainMask , YES); NSString* cacheDirectory = [pathcaches objectAtIndex:0]; NSLog(@"cacheDirectory=%@",cacheDirectory); /** 使用NSSearchPathForDirectoriesInDomains只能定位Caches目录和Documents目录。 tmp目录,不能按照上面的做法获得目录了,有个函数可以获得应用的根目录 */ NSString *tempDir1=NSHomeDirectory() ; NSString *tempDir2=NSTemporaryDirectory(); NSLog(@"tempDir1=%@",tempDir1); NSLog(@"tempDir2=%@",tempDir2);
归档 普通自定义对象和字节流之间的转换
序列化 某些特定类型(NSDictionary, NSArray, NSString, NSDate, NSNumber,NSData)的数据和字节流之间(通常将其保存为plist文件)的转换
2.1 归档
如果我们需要将自定义的一个对象保存到文件,应该如何做呢?
这里引入两个东西:一个是NSCoding协议 ;另一个是NSKeyedArchiver,NSKeyedArchiver其实继承于NSCoder,可以以键值对的方式将对象的属性进行序列化和反序列化。
具体的过程可以这样描述 通过NSKeyedArchiver 可以将实现了NSCoding协议的对象 和 字节流 相互转换 。
像一些框架中的数据类型如NSDictionary,NSArray,NSString... 都已经实现了NSCoding协议,所以可以直接对他们进行归档操作。
这里来一个比较完整的例子,一个Address类,一个User类,User类下有个Address类型的属性
#import <Foundation/Foundation.h> @interface Address : NSObject<NSCoding> { NSString *country; NSString *city; } @property(nonatomic,copy) NSString *country; @property(nonatomic,copy) NSString *city; @end
#import "Address.h" @implementation Address @synthesize country; @synthesize city; - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:country forKey:@"country"]; [aCoder encodeObject:city forKey:@"city"]; } - (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { [self setCountry:[aDecoder decodeObjectForKey:@"country"]]; [self setCity:[aDecoder decodeObjectForKey:@"city"]]; } return self; } @end
#import <Foundation/Foundation.h> #import "Address.h" @interface User : NSObject<NSCoding>{ NSString *_name; NSString *_password; Address *_address; } @property(nonatomic,copy) NSString *name; @property(nonatomic,copy) NSString *password; @property(nonatomic,retain) Address *address; @end
#import "User.h" @implementation User @synthesize name = _name; @synthesize password = _password; @synthesize address = _address; - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeObject:_password forKey:@"password"]; [aCoder encodeObject:_address forKey:@"address"]; } - (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { [self setName:[aDecoder decodeObjectForKey:@"name"]]; [self setPassword:[aDecoder decodeObjectForKey:@"password"]]; [self setAddress:[aDecoder decodeObjectForKey:@"address"]]; } return self; } @end
操作应用
NSString *tempDir2=NSTemporaryDirectory(); // Do any additional setup after loading the view, typically from a nib. Address *myAddress = [[Address alloc] init] ; myAddress.country = @"中国"; myAddress.city = @"杭州"; User *user = [[User alloc] init] ; user.name = @"卢克"; user.password = @"lukejin"; user.address = myAddress; //归档 保存的是plist的二进制数据格式 NSString *path = [tempDir2 stringByAppendingPathComponent:@"user"]; [NSKeyedArchiver archiveRootObject:user toFile:path]; //从文档中读取 User *object = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"object.name : %@",object.name);
使用数据对象自带的方法,如字典类写文件:
数据:
NSMutableDictionary *dataDictionary = [[NSMutableDictionary alloc] init] ; [dataDictionary setValue:[NSNumber numberWithInt:222] forKey:@"intNumber"]; [dataDictionary setValue:[NSArray arrayWithObjects:@"1",@"2", nil] forKey:@"testArray"];
写文件
[dataDictionary writeToFile:@"/Users/zhoumoban/Desktop/test.plist" atomically:YES];
读文件:
NSDictionary *dictionaryFromFile = [NSDictionary dictionaryWithContentsOfFile:@"/Users/zhoumoban/Desktop/test.plist"]; NSLog(@"%@",[dictionaryFromFile objectForKey:@"intNumber"]);
另外:使用NSPropertyListSerialization类。通过NSPropertyListSerialization类可以将数据对象直接转成NSData或者直接写到文件或者流中去
NSString *error; NSData *xmlData = [NSPropertyListSerialization dataFromPropertyList:dataDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; if(xmlData) { NSLog(@"No error creating XML data."); [xmlData writeToFile:@"/Users/zhoumoban/Desktop/test2.plist" atomically:YES]; } else { if (error) { NSLog(@"error:%@", error); // [error release]; } } //读取 NSDictionary *dictionaryFromFile2 = (NSDictionary *)[NSPropertyListSerialization propertyListWithData:[NSData dataWithContentsOfFile:@"/Users/zhoumoban/Desktop/test2.plist"] options:0 format:NULL error:&error]; NSLog(@"===%@",[dictionaryFromFile2 objectForKey:@"intNumber"]);
相关推荐
iOS归档是一种原生的序列化机制,它利用Objective-C的Runtime特性,将对象转换为二进制数据,以便于存储或在网络上传输。归档可以有效地保留对象的完整状态,包括其类信息和属性值。现在,我们将深入探讨iOS归档的...
《精通iOS开发 第7版》是一本深入探讨iOS应用程序开发的专业书籍,其归档文件包含了丰富的源代码和资源文件,旨在帮助开发者深入了解并熟练掌握iOS平台的开发技术。这一版本聚焦于最新的iOS版本,提供了全面的更新和...
在iOS开发中,文件管理与归档是至关重要的部分,特别是在处理用户数据持久化和应用状态保存时。本文将深入探讨iOS中的文件管理和归档机制,重点介绍如何使用plist和text文件进行数据存储。 首先,我们需要理解iOS的...
realm 太过笨重,归档太麻烦,最后选择了文件缓存, 看了很多博客,在参考了别人的缓存开源项目,功能太过简单单一化, 比如:我想删除某一个文件下的缓存信息,大部分是只提供了删除所有缓存, 不可以按目录删除。...
iOS原生文件系统解析 iOS操作系统使用的是名为“HFS+”(Hierarchical File System Plus)的文件系统,这是苹果公司在其Mac OS X系统中引入的,并被移植到了iOS设备上。HFS+是一个日志式的文件系统,它提供了一种...
首先,归档是iOS中的Objective-C runtime提供的一种序列化技术,它能够将对象的状态转换为字节流,方便存储到磁盘上。归档主要依赖于`NSKeyedArchiver`类,通过调用`archiveRootObject:toFile:`方法,可以将指定的...
1. **NSCache**: NSCache是内存中的缓存,用于临时存储对象,但当系统内存紧张时,它会自动清空。在离线缓存场景下,由于内存有限,可能不适合存储大量数据。 2. **UserDefaults**: UserDefaults适合存储轻量级的...
在iOS中,常见的数据持久化方式包括:Core Data、SQLite、Plist、文件系统存储以及归档/反归档等。 归档和反归档是Objective-C中的数据持久化方法,它利用NSCoding协议来实现对象的序列化和反序列化。当对象需要被...
iOS 应用程序只能在自己的沙盒目录中读取文件,不能访问其他应用程序的文件目录。 沙盒机制的特点: 1.每个应用程序都有自己的存储空间,沙盒目录下面有三个文件夹:Documents、Library 和 tmp。 2.应用程序不能翻...
在 IOS 平台下,我们不能直接使用文件流来保存和读取资源,因为 IOS 平台有其自己的文件系统。因此,我们需要使用特殊的方法来保存和读取资源。在 IOS 平台下,我们可以使用 Application.dataPath 来获取文件的路径...
在iOS应用开发中,调试是不可或缺的一环,尤其是在处理文件系统操作时,如Documents、Media等目录下的文件管理。本文将详细介绍如何利用开源项目“TySimulator”来快速访问并调试iOS应用内的文件系统。 ...
归档的作用就是将对象以文件的形式保存到磁盘中,以使得数据序列化和持久化。 使用归档的时候读取该文件保存路径来读取文件的内容,归档的文件是进行过保密处理的,在磁盘上是无法查看文件的内容的,这也是和属性...
3. 缓存存储:将获取的数据保存到`Library/Caches`目录下,可以使用`PropertyListEncoder`或`JSONEncoder`进行序列化。 4. UITableView显示:从缓存中读取数据,填充UITableView,并实现刷新和加载更多功能。 5. ...
在iOS中,除了沙盒文件系统,还可以通过Core Data、SQLite、plist文件、UserDefaults等方式实现数据持久化。 2. LZSandBoxManage可能提供了与数据持久化相关的接口,如序列化和反序列化对象,或将数据存储为JSON、...
在iOS中,我们常用的序列化技术有NSKeyedArchiver(归档)和JSONSerialization,它们分别对应于苹果的Objective-C和Swift生态系统。NSKeyedArchiver可以将Objective-C对象转换成NSKeyedArchive格式,存储在文件中或...
本工具正是为了解决在Unity5环境中,使用Protobuf进行Android和iOS平台的泛型列表参数的正反序列化问题。 首先,我们需要理解什么是序列化和反序列化。序列化是将对象转换为可传输或存储的格式,而反序列化则是将...
磁盘缓存(如使用SQLite或文件系统)则可以保存大量数据,但访问速度相对较慢。 二、字符串缓存 字符串缓存主要涉及NSString对象,由于字符串常被用作标识符、文本等,频繁创建和销毁可能导致性能下降。一个简单的...
总结来说,"iOS 存取数据之归档"这个主题涵盖了如何使用Objective-C或Swift中的归档技术来持久化数据,特别是通过NSKeyedArchiver进行序列化和反序列化的步骤。通过示例代码如`SaveDate`,我们可以学习如何处理不同...
本文将详细讲解如何在Objective-C或Swift环境下,针对ARC(Automatic Reference Counting)内存管理机制,实现JSON实体类的序列化与反序列化。 ### 一、序列化(Serialization) 序列化是指将对象转换为可以传输或...
在C++编程中,CArchive类是MFC(Microsoft Foundation Classes)库中的一个重要组件,它提供了对象的序列化和反序列化功能。序列化是指将内存中的数据结构或对象转换为可以存储或传输的格式,而反序列化则是将这种...