最新消息:文章中包含代码时,请遵守代码高亮规范!

沙盒机制(原创)

iOS 黄, 艳承 113浏览 0评论

 

一、沙盒概述

iOS为每一个应用程序都创建了一个文件系统去存储应用程序的文件,此区域称为沙盒。沙盒作为一个文件系统结构,它可以储存声音、图像、文本等文件。

二、沙盒的特点

  • 每一个应用程序只能访问自己沙盒内的数据,其他应用的数据是无法访问的。
  • 当应用程序请求访问沙盒中存放的文件时,必须经过权限检测,只有符合条件的才可以进入沙盒访问文件。

三、沙盒结构分析

打开一个程序的沙盒目录,发现里面有三个文件夹:

沙盒目录文件结构.png
  • Documents:保存应用程序运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。
  • Library:该文件夹里包含两个文件夹,分别是Caches和Preferences。其中,Caches用于保存应用程序运行时生成的需要持久化的数据,Preferences用于存储应用的所有偏好设置,另外,iTunes同步设备时会备Preferences
    目录中的数据,而不会备份Caches目录中的数据。
  • tmp:用于保存应用程序运行时所需的临时数据,运行完毕后再将应用的文件从该目录删除。应用没有运行时,系统也有可能会清除该目录下的文件,iTunes同步设备不会备份该目录下的文件。

四、沙盒目录获取方式

1、获取沙盒根路径

想要获取沙盒根路径,可以通过NSHomeDirectory()函数实现,具体实例如下:


NSString *path = NSHomeDirectory();

2、获取 Documents文件夹路径

苹果建议开发者把程序中创建的或浏览到的文件数据保存在 Documents文件夹中,具体如下:


NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *path=[array objectAtIndex:0];

上述代码中,通过调用NSSearchPathForDirectoriesInDomains()函数,返回一个表示路径的数组,该数组的第一个元素就是Documents文件夹的路径。
一般情况下获取Documents路径不是最终目的,如果试图获取Documents目录下的某个路径则需调用stringByAppendingPathComponent方法,例如:获取Documents目录下img.png图片的代码如下所示


NSString *filepath= path stringByAppendingPathComponent:@"img.png"];

3、获取Library路径

基本和获取Documents路径相同:


NSArray *array=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
 NSString *path=[array objectAtIndex:0];

4、获取tmp文件路径

只需调用NSTemporaryDirectory()函数即可


NSString *tmp=NSTemporaryDirectory();

介绍完了,写一个dome吧!
用plist属性列表保存相关数据,并存储在应用程序的安装目录下:
界面设计与相关的对象与控件的关联如图所示:

界面设计.png
相关关联.png

写一个属性列表宏

Snip20171027_5.png

其他代码如下:

 


- (IBAction)sender:(id)sender {
    //  获取填入表格中的信息
    NSString *name=self.nameField.text;
    NSString *birthday=self.birthdayField.text;
    NSInteger genter=self.genderSegmented.selectedSegmentIndex;
    NSString *number=self.numberField.text;
    //判定表格是否完整
    if (!name.length||!birthday.length||!number.length) {
        UIAlertController *alertC=[UIAlertController alertControllerWithTitle:@"提示" message:@"信息不完整" preferredStyle: UIAlertControllerStyleActionSheet];
        UIAlertAction *action=[UIAlertAction actionWithTitle:@"确定" style: UIAlertActionStyleDefault handler:nil];
        [alertC addAction:action];
        [self presentViewController:alertC animated:YES completion:nil];
        }
    [self.view endEditing:YES];
    //创建字典对象,储存封装学生信息
    NSMutableDictionary *stydent=[[NSMutableDictionary alloc]init];
    NSMutableDictionary *dic=[[NSMutableDictionary alloc]init];
    [stydent setObject:name forKey:@"Name"];
    [stydent setObject:birthday forKey:@"Birthday"];
    [stydent setObject:number forKey:@"Number"];
    [stydent setObject:[NSNumber numberWithInteger:genter] forKey:@"Genter"];
    [dic setObject:stydent forKey:@"Student"];
    //将字典对象转为属性列表持久保存在plist文件中
    if ([dic writeToFile:[self  filepath] atomically:YES]) {
        UIAlertController *alertC=[UIAlertController alertControllerWithTitle:@"提示" message:@"保存成功" preferredStyle:0];
        UIAlertAction *action=[UIAlertAction actionWithTitle:@"确定" style:0 handler:nil];
        [alertC addAction:action];
        [self presentViewController:alertC animated:YES completion:nil];
    }
    return;
}
//获取plist文件路径
-(NSString *)filepath
{
//获取沙盒目录
    NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path=[array objectAtIndex:0];
    return [path stringByAppendingPathComponent:FileName];
}

处理键盘对输入框的影响
(1)当我们点击空白区域或保存“按钮”时,都需要关闭键盘。
(2)单击return建时,需要使键盘的光标下移(需要添加UITextFieldDelegate协议,并设置代理

self.numberField.delegate=self; self.birthdayField.delegate=self; self.nameField.delegate=self;
//单击空白,键盘退出
 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.viewIfLoaded endEditing:YES]; } //按回车键,切换文本输入框的焦点 - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (textField==self.nameField) { [self.birthdayField becomeFirstResponder]; } else if (textField==self.birthdayField){ [self.numberField becomeFirstResponder]; } return YES; }

(3)当用户填写信息时,由于屏幕有限,键盘弹起后会遮挡填写数据的界面,针对这种情况,可以将整个程序界面上移,代码如下:
在- (void)viewDidLoad{}中注册通知:



//注册通知监听器,监听键盘收起事件
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil];
    //注册通知监听器,监听键盘弹起事件
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil];</code>


如果想看存储的数据可输入


NSString *path = NSHomeDirectory();//主目录
 NSLog(@"NSHomeDirectory:%@",path);

会打印出沙盒的根目录:

Snip20171027_9.png

然后在finderc窗口->前往->前往文件夹,输入目录,便可以看到students.plist文件,如图:

Snip20171027_10.png

 

转载时请注明出处及相应链接,本文永久地址:http://blog.it985.com/22832.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Jasmine的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!