iOS开发总结之沙盒存储

1.属性列表plist存储

/*

plist只能存储是写入到Documents目录下且只能是系统自带的一些常规的类,也就是有writeToFile方法的对象才可以使用plist保存数据

字符串/字典/数据/NSNumber/NSData
...

自定义的对象不能保存到plist中

*/

/**
 *   点击保存按钮
 */
- (IBAction)saveDataBtnClick:(id)sender {

    // NSUserDomainMask 在用户目录下查找
    // YES 代表展开用户目录的~
    // NSDocumentDirectory 查找Documents文件夹
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    // 拼接文件路径   上面获取的文件路径加上文件名
    NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"];
    NSLog(@"%@", path);
    /*
     plist只能存储系统自带的一些常规的类, 也就是有writeToFile方法的对象才可以使用plist保存数据
     字符串/字典/数据/NSNumber/NSData ...
     */

    // 自定义的对象不能保存到plist中

    NSDictionary *dict = @{@"person": @"abc"};
    [dict writeToFile:path atomically:YES];
}
/**
 *   点击读取按钮
 */
- (IBAction)readDataBtnClick:(id)sender {
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"]
    ;
    // 读取数据
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
    NSLog(@"%@", dict);
}

属性列表-NSDictionary的存储和读取过程

2.偏好设置

偏好设置在 library目录下的preference中

<pre name="code" class="objc">- (IBAction)saveBtn:(id)sender {

    // 偏好设置是专门用来保存应用程序的配置信息的比如保存用户名、密码、字体大小等设置, 一般情况不要再偏好设置中保存其他数据
    // 如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的
    // 偏好设置会将所有的数据保存到同一个文件中

    // 获取NSUserDefaults对象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    // 保存数据(如果设置数据之后没有同步, 会在将来某一时间点自动将数据保存到Preferences文件夹下面)
    [defaults setObject:@"tinghou" forKey:@"name"];
    [defaults setObject:@"man" forKey:@"gender"];
    [defaults setInteger:13 forKey:@"age"];
    [defaults setDouble:10.1 forKey:@"height"];

    // 让NSUserDefaults立刻保存数据 注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入

    [defaults synchronize];  //如果要立刻保存就需要这行代码

}

- (IBAction)readBtn:(id)sender {

    // 1.获取NSUserDefaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    // 2.通过NSUserDefaults获取保存的数据
    NSString *name = [defaults objectForKey:@"name"];
    int age = [defaults integerForKey:@"age"];
    NSLog(@"%@", name);
    NSLog(@"%d", age);
}

+(BOOL)isFirstOpen{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    BOOL firstOpen = [userDefaults boolForKey:@"firstOpen"];
    return firstOpen;
}
+(void)setFirstOpen:(BOOL)b{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setBool:b forKey:@"firstOpen"];
    [userDefaults synchronize];
}

+(BOOL)login{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    BOOL loginState = [userDefaults boolForKey:@"login"];
    return loginState;
}

+(BOOL)setLogin:(BOOL)loginState{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setBool:loginState forKey:@"login"];
    [userDefaults synchronize];
    return loginState;
}

3.归档

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复

不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以

NSCoding协议有2个方法:

encodeWithCoder:

每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

initWithCoder:

每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量

- (IBAction)saveBtnClick:(id)sender {
    // 1.创建对象
    /*
    NJPerson *p = [[NJPerson alloc] init];
    p.name = @"lnj";
    p.age = 100;
    p.height = 1.76;
     */

    NJStudent *stu = [[NJStudent alloc] init];
    stu.name = @"lnj";
    stu.age = 100;
    stu.height = 1.8;
    stu.weight = 60;

    // 2.获取文件路径 (获取文件路径方法和plist存储的一样)
    NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    //用上面获得的文件路径(document)加上文件名  拼接文件路径
    NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];
    NSLog(@"path = %@", path);

    // 3.将自定义对象保存到文件中
//    [NSKeyedArchiver archiveRootObject:p toFile:path];
    [NSKeyedArchiver archiveRootObject:stu toFile:path];

}

- (IBAction)readBtnClick:(id)sender {

    // 1.获取文件路径
    NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];

    // 2.从文件中读取对象
//    NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    NJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    NSLog(@"%@ %d %.1f %.1f", stu.name, stu.age, stu.height, stu.weight);
}

NSKeyedArchiver归档如果想将一个自定义对象保存到文件中必须实现NSCoding协议

时间: 2024-12-15 18:40:32

iOS开发总结之沙盒存储的相关文章

iOS开发之获取沙盒路径

iOS开发之沙盒机制(SandBox)具体解说了沙盒的一些机制.在开发中,我们须要对沙盒进行操作.所以我们须要获取到沙盒路径. 沙盒里的目录包含Documents.Library.tmp.这三个目录的作用请点击这里.接下来我们来解说怎样获取Documents.Library.tmp的路径. 获取沙盒根文件夹 获取沙盒根文件夹.直接调用NSHomeDirectory(): //获取沙盒根文件夹 NSString *directory = NSHomeDirectory(); NSLog(@"dir

iOS开发之应用沙盒

1.应用沙盒概述 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer). 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本) /Users/apple/Library/Application Support/iPhone Simulator/6.0/ Applications [备注]默认情况下,模拟器的目录是隐藏的,要想显示出来

iOS开发日记14-NSFileManager(沙盒和清除缓存)

今天博主有一个文件管理的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像Android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录. Documents:苹果建议将程序创建产生的文件以及应用浏览产生的文件数

沙盒存储

转载自:http://blog.csdn.net/enuola/article/details/8076221 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.

【转】iOS开发24:使用SQLite3存储和读取数据

转自:http://my.oschina.net/plumsoft/blog/57626 SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加到内存中. 基本操作: (1)打开或者创建数据库 sqlite3 *database; int result = sqlite3_open("/path/databaseFile", &database); 如果/path/databaseFile不存在,则创建它,否则打开它.如果

再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸

作者:蒸米 ----------------- 0x00 序 Ian [email protected]发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],[email protected]也发表了关于Triple_Fetch的分析[2],但由于这个漏洞和exp有非常多的亮点,所以还剩很多可以深入挖掘的细节.因此,我们简单分析一下漏洞形成的原因,并具体介绍一下漏洞利用的细节,以及如何利用这个漏洞做到iOS 10.3.2上的沙盒逃逸. 0x01 CVE-2017

iOS模拟器的应用沙盒在MAC中的位置

每个iOS应用都有自己专属的应用沙盒.分别为 应用程序包 Documents/ Library/Caches/ Library/Preferences/ tmp/ 当运行模拟时,在MAC下找到对应路径的规则随XCode的版本会有不同,在XCode6下的路径为 应用程序包 ~Library/Developer/CoreSimulator/Devices/<模拟器设备id>/data/Containers/Bundle/Application/<应用id> 其中模拟器设备id可以在XC

沙盒存储之路径

Documents:保存应用程序运行时生成的需要持久化的数据,iTunes会自动备份该目录 Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录 Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录文件不会在应用退出删除.一般存放体积比较大的,不是特别重要的资源 Library/Preferences:保存应用的所有偏好设置,iTunes会自动备份该目录 tmp:保存应用运行时所需要的临时数据,使用完成后文件将相应的文件从该目录删除,iTune

iOS开发查看手机app本地存储的文件

开发过程中,有时会在本地存储一些文件,但是我们不确定有没有存上,可以通过以下方法来查看测试手机上本地存储的文件: 1.选择xcode上面的window下面的Devices 2.先在左边选中你当前的设备,然后在右下角选择你要查看的app,点击下面的齿轮按钮,选择下载,就能得到你要看的app当前沙盒里存储的文件了. 具体操作看下图