iOS开发总结之沙盒存储

每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒。沙盒下的目录如下:

  • Application:存放程序源文件,上架前经过数字签名,上架后不可修改
  • Documents: 保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
  • tmp: 保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用 没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。
  • Library/Caches: 保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份 该目录。⼀一般存储体积大、不需要备份的非重要数据,比如网络数据缓存存储到Caches下
  • Library/Preference: 保存应用的所有偏好设置,如iOS的Settings(设置) 应⽤会在该目录中查找应⽤的设置信息。iTunes同步设备时会备份该目录

1.属性列表plist存储

    /*

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

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

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

     */


[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  *   点击保存按钮 
  3.  */  
  4. - (IBAction)saveDataBtnClick:(id)sender {  
  5.       
  6.       
  7.     // NSUserDomainMask 在用户目录下查找  
  8.     // YES 代表展开用户目录的~  
  9.     // NSDocumentDirectory 查找Documents文件夹  
  10.     NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  11.     // 拼接文件路径   上面获取的文件路径加上文件名  
  12.     NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"];  
  13.     NSLog(@"%@", path);  
  14.     /* 
  15.      plist只能存储系统自带的一些常规的类, 也就是有writeToFile方法的对象才可以使用plist保存数据 
  16.      字符串/字典/数据/NSNumber/NSData ... 
  17.      */  
  18.       
  19.     // 自定义的对象不能保存到plist中  
  20.       
  21.     NSDictionary *dict = @{@"person"@"abc"};  
  22.     [dict writeToFile:path atomically:YES];  
  23. }  
  24. /** 
  25.  *   点击读取按钮 
  26.  */  
  27. - (IBAction)readDataBtnClick:(id)sender {  
  28.     NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  29.       
  30.     NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"]  
  31.     ;  
  32.     // 读取数据  
  33.     NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];  
  34.     NSLog(@"%@", dict);  
  35. }  
属性列表-NSDictionary的存储和读取过程


2.偏好设置

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="objc">- (IBAction)saveBtn:(id)sender {  
  2.   
  3.     // 偏好设置是专门用来保存应用程序的配置信息的比如保存用户名、密码、字体大小等设置, 一般情况不要再偏好设置中保存其他数据  
  4.     // 如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的  
  5.     // 偏好设置会将所有的数据保存到同一个文件中  
  6.       
  7.     // 获取NSUserDefaults对象  
  8.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  9.       
  10.     // 保存数据(如果设置数据之后没有同步, 会在将来某一时间点自动将数据保存到Preferences文件夹下面)  
  11.     [defaults setObject:@"tinghou" forKey:@"name"];  
  12.     [defaults setObject:@"man" forKey:@"gender"];  
  13.     [defaults setInteger:13 forKey:@"age"];  
  14.     [defaults setDouble:10.1 forKey:@"height"];  
  15.       
  16.       
  17.     // 让NSUserDefaults立刻保存数据 注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入  
  18.   
  19.     [defaults synchronize];  //如果要立刻保存就需要这行代码  
  20.   
  21. }  
  22.   
  23. - (IBAction)readBtn:(id)sender {  
  24.       
  25.     // 1.获取NSUserDefaults  
  26.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  27.     // 2.通过NSUserDefaults获取保存的数据  
  28.     NSString *name = [defaults objectForKey:@"name"];  
  29.     int age = [defaults integerForKey:@"age"];  
  30.     NSLog(@"%@", name);  
  31.     NSLog(@"%d", age);  
  32. }  


 
 
[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. +(BOOL)isFirstOpen{  
  2.     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  
  3.     BOOL firstOpen = [userDefaults boolForKey:@"firstOpen"];  
  4.     return firstOpen;  
  5. }  
  6. +(void)setFirstOpen:(BOOL)b{  
  7.     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  
  8.     [userDefaults setBool:b forKey:@"firstOpen"];  
  9.     [userDefaults synchronize];  
  10. }  
  11.   
  12. +(BOOL)login{  
  13.     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  
  14.     BOOL loginState = [userDefaults boolForKey:@"login"];  
  15.     return loginState;  
  16. }  
  17.   
  18. +(BOOL)setLogin:(BOOL)loginState{  
  19.     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  
  20.     [userDefaults setBool:loginState forKey:@"login"];  
  21.     [userDefaults synchronize];  
  22.     return loginState;  
  23. }  


 
 

3.归档

如果对象是 NSString NSDictionary NSArray NSData NSNumber 等类型,可以直接用 NSKeyedArchiver 进行归档和恢复
不是所有的对象都可以直接用这种方法进行归档,只有遵守了 NSCoding 协议的对象才可以
NSCoding 协议有 2 个方法:
encodeWithCoder :

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

initWithCoder :

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. - (IBAction)saveBtnClick:(id)sender {  
  2.     // 1.创建对象  
  3.     /* 
  4.     NJPerson *p = [[NJPerson alloc] init]; 
  5.     p.name = @"lnj"; 
  6.     p.age = 100; 
  7.     p.height = 1.76; 
  8.      */  
  9.       
  10.     NJStudent *stu = [[NJStudent alloc] init];  
  11.     stu.name = @"lnj";  
  12.     stu.age = 100;  
  13.     stu.height = 1.8;  
  14.     stu.weight = 60;  
  15.       
  16.     // 2.获取文件路径 (获取文件路径方法和plist存储的一样)  
  17.     NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  18.     //用上面获得的文件路径(document)加上文件名  拼接文件路径  
  19.     NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];  
  20.     NSLog(@"path = %@", path);  
  21.       
  22.     // 3.将自定义对象保存到文件中  
  23. //    [NSKeyedArchiver archiveRootObject:p toFile:path];  
  24.     [NSKeyedArchiver archiveRootObject:stu toFile:path];  
  25.       
  26. }  
  27.   
  28. - (IBAction)readBtnClick:(id)sender {  
  29.       
  30.     // 1.获取文件路径  
  31.     NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  32.     NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];  
  33.   
  34.     // 2.从文件中读取对象  
  35. //    NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];  
  36.       
  37.     NJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path];  
  38.   
  39.       
  40.     NSLog(@"%@ %d %.1f %.1f", stu.name, stu.age, stu.height, stu.weight);  
  41. }  

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






4.ios沙盒目录

1、获取程序的Home目录
      NSString  *path = NSHomeDirectory();
      NSLog(@"path:%@",path);
      打印结果:
path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A
   真机上的目录是:
/var/mobile/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2
   可见,真机上的目录是/var/mobile/Applications/这个目录下的,和模拟器不一样。这个是Home目录,其他的子目录和模拟器一样。


2、获取Document目录
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
   NSString *path = [paths objectAtIndex:0]; 
   NSLog(@"path:%@", path); 
   打印结果: 
  path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A/Documents


3、获取Cache目录
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
   NSString *path = [paths objectAtIndex:0]; 
   NSLog(@"path:%@", path); 
   打印结果:
path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A/Library/Caches


4、获取Library目录
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
   NSString *path = [paths objectAtIndex:0]; 
   NSLog(@"path:%@", path);
   打印结果:
path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A/Library
5、获取Tmp目录
   NSString *path = NSTemporaryDirectory(); 
   NSLog(@"%@", path);
   打印结果:
path:/var/folders/hj/8sgyk0f555l1z_n95p2b2kp00000gn/T/  


6、写入文件
   NSArray  *paths  =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
   NSString *docDir = [paths objectAtIndex:0];
   if(!docDir) {
        NSLog(@"Documents 目录未找到");
   }
   NSArray *array = [[NSArray alloc] initWithObjects:@"内容",@"content",nil];
   NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
   [array writeToFile:filePath atomically:YES];


7、读取文件
   NSArray  *paths  =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
   NSString *docDir = [paths objectAtIndex:0];
   NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
   NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
   NSLog(@"%@",array);

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值