iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化

Java代码  

  1. /**
  2. 1:Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
  3. 2:tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
  4. 3:Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
  5. */
  6. NSArray *paths1=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory
  7. , NSUserDomainMask
  8. , YES);
  9. NSString *documentsDirect=[paths1 objectAtIndex:0];
  10. assert(1 == paths1.count);
  11. NSLog(@">>documentsDirect=%@",documentsDirect);
  12. NSArray *Librarypaths =  NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSDocumentDirectory, YES);
  13. NSString* libraryDirectory  = [Librarypaths objectAtIndex:0];
  14. NSLog(@">>Librarypaths.length =%d",[Librarypaths count]);
  15. assert(1 < Librarypaths.count);
  16. NSLog(@"libraryDirectory=%@",libraryDirectory);
  17. //如果要指定其他文件目录,比如Caches目录,需要更换目录工厂常量,上面代码其他的可不变
  18. NSArray *pathcaches=NSSearchPathForDirectoriesInDomains(NSCachesDirectory
  19. , NSUserDomainMask
  20. , YES);
  21. NSString* cacheDirectory  = [pathcaches objectAtIndex:0];
  22. NSLog(@"cacheDirectory=%@",cacheDirectory);
  23. /**
  24. 使用NSSearchPathForDirectoriesInDomains只能定位Caches目录和Documents目录。
  25. tmp目录,不能按照上面的做法获得目录了,有个函数可以获得应用的根目录
  26. */
  27. NSString *tempDir1=NSHomeDirectory() ;
  28. NSString *tempDir2=NSTemporaryDirectory();
  29. NSLog(@"tempDir1=%@",tempDir1);
  30. NSLog(@"tempDir2=%@",tempDir2);
/**
    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类型的属性

Java代码  

  1. #import <Foundation/Foundation.h>
  2. @interface Address : NSObject<NSCoding>
  3. {
  4. NSString *country;
  5. NSString *city;
  6. }
  7. @property(nonatomic,copy) NSString *country;
  8. @property(nonatomic,copy) NSString *city;
  9. @end
#import <Foundation/Foundation.h>

@interface Address : NSObject<NSCoding>
{
    NSString *country;
    NSString *city;
}
@property(nonatomic,copy) NSString *country;
@property(nonatomic,copy) NSString *city;
@end

Java代码  

  1. #import "Address.h"
  2. @implementation Address
  3. @synthesize country;
  4. @synthesize city;
  5. - (void)encodeWithCoder:(NSCoder *)aCoder{
  6. [aCoder encodeObject:country forKey:@"country"];
  7. [aCoder encodeObject:city forKey:@"city"];
  8. }
  9. - (id)initWithCoder:(NSCoder *)aDecoder{
  10. if (self = [super init]) {
  11. [self setCountry:[aDecoder decodeObjectForKey:@"country"]];
  12. [self setCity:[aDecoder decodeObjectForKey:@"city"]];
  13. } return self;
  14. }
  15. @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

Java代码  

  1. #import <Foundation/Foundation.h>
  2. #import "Address.h"
  3. @interface User : NSObject<NSCoding>{
  4. NSString *_name;
  5. NSString *_password;
  6. Address *_address;
  7. }
  8. @property(nonatomic,copy) NSString *name;
  9. @property(nonatomic,copy) NSString *password;
  10. @property(nonatomic,retain) Address *address;
  11. @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

Java代码  

  1. #import "User.h"
  2. @implementation User
  3. @synthesize name = _name;
  4. @synthesize password = _password;
  5. @synthesize address = _address;
  6. - (void)encodeWithCoder:(NSCoder *)aCoder{
  7. [aCoder encodeObject:_name forKey:@"name"];
  8. [aCoder encodeObject:_password forKey:@"password"];
  9. [aCoder encodeObject:_address forKey:@"address"];
  10. }
  11. - (id)initWithCoder:(NSCoder *)aDecoder{
  12. if (self = [super init]) {
  13. [self setName:[aDecoder decodeObjectForKey:@"name"]];
  14. [self setPassword:[aDecoder decodeObjectForKey:@"password"]];
  15. [self setAddress:[aDecoder decodeObjectForKey:@"address"]];
  16. }
  17. return self;
  18. }
  19. @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

操作应用

Java代码  

  1. NSString *tempDir2=NSTemporaryDirectory();
  2. // Do any additional setup after loading the view, typically from a nib.
  3. Address *myAddress = [[Address alloc] init] ;
  4. myAddress.country = @"中国";
  5. myAddress.city = @"杭州";
  6. User *user = [[User alloc] init] ;
  7. user.name = @"卢克";
  8. user.password = @"lukejin";
  9. user.address = myAddress;
  10. //归档  保存的是plist的二进制数据格式
  11. NSString *path = [tempDir2 stringByAppendingPathComponent:@"user"];
  12. [NSKeyedArchiver archiveRootObject:user toFile:path];
  13. //从文档中读取
  14. User *object = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
  15. NSLog(@"object.name : %@",object.name);
 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);
使用数据对象自带的方法,如字典类写文件:

数据:

Java代码  

  1. NSMutableDictionary *dataDictionary = [[NSMutableDictionary alloc] init] ;
  2. [dataDictionary setValue:[NSNumber numberWithInt:222] forKey:@"intNumber"];
  3. [dataDictionary setValue:[NSArray arrayWithObjects:@"1",@"2", nil] forKey:@"testArray"];
  NSMutableDictionary *dataDictionary = [[NSMutableDictionary alloc] init] ;
    [dataDictionary setValue:[NSNumber numberWithInt:222] forKey:@"intNumber"];
    [dataDictionary setValue:[NSArray arrayWithObjects:@"1",@"2", nil] forKey:@"testArray"];

写文件

Java代码  

  1. [dataDictionary writeToFile:@"/Users/zhoumoban/Desktop/test.plist" atomically:YES];
[dataDictionary writeToFile:@"/Users/zhoumoban/Desktop/test.plist" atomically:YES];

读文件:

Java代码  

  1. NSDictionary *dictionaryFromFile = [NSDictionary dictionaryWithContentsOfFile:@"/Users/zhoumoban/Desktop/test.plist"];
  2. NSLog(@"%@",[dictionaryFromFile objectForKey:@"intNumber"]);
 NSDictionary *dictionaryFromFile = [NSDictionary dictionaryWithContentsOfFile:@"/Users/zhoumoban/Desktop/test.plist"];
    NSLog(@"%@",[dictionaryFromFile objectForKey:@"intNumber"]);

另外:使用NSPropertyListSerialization类。通过NSPropertyListSerialization类可以将数据对象直接转成NSData或者直接写到文件或者流中去

Java代码  

  1. NSString *error;
  2. NSData *xmlData = [NSPropertyListSerialization dataFromPropertyList:dataDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
  3. if(xmlData) {
  4. NSLog(@"No error creating XML data.");
  5. [xmlData writeToFile:@"/Users/zhoumoban/Desktop/test2.plist" atomically:YES];
  6. } else {
  7. if (error) {
  8. NSLog(@"error:%@", error);
  9. // [error release];
  10. }
  11. }
  12. //读取
  13. NSDictionary *dictionaryFromFile2 = (NSDictionary *)[NSPropertyListSerialization propertyListWithData:[NSData dataWithContentsOfFile:@"/Users/zhoumoban/Desktop/test2.plist"] options:0 format:NULL error:&error];
  14. NSLog(@"===%@",[dictionaryFromFile2 objectForKey:@"intNumber"]);
时间: 2024-12-21 01:53:34

iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化的相关文章

IOS常用的系统文件目录介绍

iOS常用目录整理说明是本文要介绍的内容,虽然不同API全面,也算是在编程中常用到的存放目录,所以是必备文档,不多说,来看详细内容讲解. 1.[/Applications] 常用软件的安装目录 内建软体及JB软体存放位置 2. [/private /var/ mobile/Media /iphone video Recorder] 录像文件存放目录 3.[/private /var/ mobile/Media /DCIM] 相机拍摄的照片文件存放目录 4.[/private/var/ mobil

iOS开发网络篇—数据缓存

iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器

IOS问题汇总:2015-1-9 iOS 调用系统发短信以及打电话功能

iOS 调用系统发短信以及打电话功能 ios电话smsinterface互联网class先介绍一种最简单的方法: 调用打电话功能 [[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@“tel://10086”]]; 调用发短信功能 [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@“sms://10000”]]; 上面的发短信的功能是调用系统的

IOS 调用系统发短信以及打电话的功能

IOS 调用系统发短信以及打电话的功能 http://blog.csdn.net/lwq421336220/article/details/7818979 先介绍一种最简单的方法: 调用打电话功能 [[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"tel://10086"]]; 调用发短信功能 [[UIApplication sharedApplication]openURL:[NSURL URLWithS

微信公众号弹出框在IOS最新系统中点击键盘上的“完成”导致事件无法触发问题

微信公众号弹出框在IOS最新系统中点击键盘上的"完成"导致事件无法触发问题 问题描述 微信公众号中有项功能是弹框模态框,输入信息后保存操作.但是在IOS系统中发现,当输入内容后,点击键盘上的"完成"后,再点击"提交"无反应:跳过"完成"直接点击"提交"就可以正常保存 问题原因 当键盘弹出后,会将body向上弹起:但是点击"完成"后并没有将body拉回,导致点击事件不在body内而无法触发

iOS 调用系统电话

1,直接调用,结束后不返回自己的应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://10086"]]; 2,使用WebView请求调用系统电话,结束后可以返回自身应用,合法 UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero]; [self.view addSubview:webView]; [webView l

iOS 捕获系统外异常

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 有时应用崩溃,而日志中的输出信息太少,无法定位问题,这是最头疼的事情,尤其很累的时侯,已经想不起来刚才改过什么了,这就叫做无耐. 工欲善其事,必先

iOS的系统层级结构和相关的框架

一,概述 iOS的系统架构分为四个层次:核心操作系统层(Core OS layer).核心服务层(Core Services layer).媒体层(Media layer)和可触摸层(Cocoa Touch layer).理解iOS的系统构架,对我们日常开发有很大帮助.其实iOS是基于UNIX的,所以我们完全可以相信这个操作系统,要知道从系统的稳定性上来说它要比其他操作系统的产品好很多. 二, IOS操作系统的层次结构及相关框架 1.Core OS 核心层:包含Accelerate Framew

iOS教程:详解iOS多图下载的缓存机制

ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cell里显示一张图片,而且这些图片都需要从网上下载. 2. 容易遇到的问题 如果不知道或不使用异步操作和缓存机制,那么写出来的代码很可能会是这样: cell.textLabel.text = app.name; cell.detailTextLabel.text = app.download;NSDat