iOS开发基础28-数据存储与沙盒机制
1.iOS开发基础1-第一个iOS程序2.iOS开发基础2-基础控件3.iOS开发基础6-懒加载、Plist 文件操作、字典转模型、自定义 View 详解4.iOS开发基础5-UIButton5.iOS开发基础4-图像资源6.iOS开发基础3-UIImage7.iOS开发基础14-KVC的应用与底层逻辑8.iOS开发基础13-深入理解 UITableView(二)9.iOS开发基础12-深入理解UITableView(一)10.iOS开发基础11-屏幕适配、Autolayout及 Masonry 框架11.iOS开发基础10-UIButton内边距和图片拉伸模式12.iOS开发基础9-提示框(UIAlertController)13.iOS开发基础8-UIScrollView14.iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View15.iOS开发基础30-UITabBarController16.iOS开发基础29-触摸事件及手势识别
17.iOS开发基础28-数据存储与沙盒机制
18.iOS开发基础27-导航控制器入栈与出栈机制及微博个人详情页19.iOS开发基础26-空20.iOS开发基础25-ARC和MRC深入探析21.iOS开发基础24-UIPickerView、UITextField、KVC、UIDatePicker、控制器及导航控制器22.iOS开发基础23-iOS开发中的Info.plist、UIApplication及其Delegate、UIWindow详解23.iOS开发基础22-键盘通知在iOS开发中的应用24.iOS开发基础21-深入理解通知、代理、KVO和Block在iOS开发中的应用25.iOS开发基础20-UITableView的全局及局部刷新、左滑操作与批量删除26.iOS开发基础19-深入理解和实现不等高的 UITableViewCell27.iOS开发基础18-深入理解 Objective-C Runtime 机制28.iOS开发基础16-使用 `NSTimer` 时避免内存泄露的技巧和最佳实践29.iOS开发基础15-KVO的应用与底层逻辑30.iOS开发基础65-iPad 开发指南31.iOS开发基础64-二维码32.iOS开发基础63-AVFoundation/MediaPlayer33.iOS开发基础62-音频播放34.iOS开发基础61-通讯录35.iOS开发基础60-传感器36.iOS开发基础59-内存优化37.iOS开发基础58-支付宝集成指南38.iOS开发基础57-换肤功能与静态库开发指南39.iOS开发基础56-UIDynamic物理引擎40.iOS开发基础55-利用 UIWindow 实现快速滚动到界面顶部41.iOS开发基础54-CoreLocation42.iOS开发基础53-MapKit 框架43.iOS开发基础47-iOS键盘44.iOS开发基础46-数据安全与HTTPS保护详解45.iOS开发基础45-UIWebview46.iOS开发基础44-网络编程之NSURLSession&AFN47.iOS开发基础43-CocoaPods48.iOS开发基础42-网络编程之文件下载与处理49.iOS开发基础41-网络编程之JSON和XML50.iOS开发基础40-网络编程之NSURLConnection51.iOS开发基础39-RunLoop52.iOS开发基础38-多线程之多图片下载及缓存处理53.iOS开发基础37-多线程之NSOperation54.iOS开发基础36-多线程之GCD55.iOS开发基础35-多线程之NSThread56.iOS开发基础34-多线程57.iOS开发基础33-核心动画(二)58.iOS开发基础33-核心动画(一)59.iOS开发基础32-Quartz2D(二)60.iOS开发基础32-Quartz2D(一)61.iOS开发基础31-Modal 与 Push 详解62.iOS开发基础76-iOS 开发中的属性修饰符详解63.iOS开发基础75-iOS开发中的Block深度解析64.iOS开发基础74-Swift他来了65.iOS开发基础73-24种性能优化技巧66.iOS开发基础72-Xcode 7 升级后的问题与解决方案详解67.iOS开发基础71-应用中的 StatusBar 详解68.iOS开发基础70-TCP与UDP69.iOS开发基础69-应用开发中的 Controller 间通信模式70.iOS开发基础68-图片轮播71.iOS开发基础67-流水布局相册缩放72.iOS开发基础66-UISearchBar 控件指南73.iOS开发基础78-iOS 国际化在iOS开发中,数据存储是非常重要的一环。本文将详细介绍iOS数据存储的常用方式,并对应用沙盒机制进行深入分析。
一、iOS应用数据存储的常用方式
1. XML属性列表(plist)归档
属性列表(Property List,简称plist)是一种用于存储简单结构化数据的XML格式文件。常用于存储数组、字典等基本数据类型。无法存储自定义对象。
2. Preference(偏好设置)
偏好设置是用于存储应用配置等简单数据的方式,使用NSUserDefaults
类进行操作。它提供了一套标准的解决方案来保存和读取键值对数据,不需要关心具体存储文件的位置。
3. NSKeyedArchiver归档(NSCoding)
NSKeyedArchiver是一种将对象及其属性序列化为二进制数据,并将其写入文件的机制。通过实现NSCoding协议,可以归档和解档自定义对象。
4. SQLite3
SQLite3是一种轻量级关系数据库,适合存储结构化数据。可以通过C函数库进行操作,也可以使用第三方封装库(如FMDB)来简化操作。
5. Core Data
Core Data是iOS提供的对象图管理和持久化框架,适合用于处理更复杂的数据模型和关系。它不仅提供了对SQLite的封装,还支持内存存储、文件存储等多种持久化选项。
二、应用沙盒机制
每个iOS应用都有自己的应用沙盒,与其他应用隔离。这种机制保证了应用的数据安全。
1. 应用沙盒结构
沙盒目录主要包括以下几部分:
- 应用程序包:包含了所有的资源文件和可执行文件。
- Documents:用于存储需要持久化的数据,备份时会包含此目录。适合存储用户生成的文件(如游戏存档)。
- tmp:用于存储临时数据,可能会被系统清理,备份时不包含此目录。
- Library/Caches:用于存储体积大、不需要备份的非重要数据。系统可能会清理此目录。
- Library/Preferences:用于存储应用的所有偏好设置,备份时会包含此目录。
2. 获取应用沙盒目录
// 获取沙盒根路径
NSString *homeDirectory = NSHomeDirectory();
// 获取tmp目录
NSString *tmpPath = NSTemporaryDirectory();
// 获取Documents目录
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 获取Library/Caches目录
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 获取Library/Preferences目录
NSString *preferencesPath = [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) firstObject];
三、属性列表(plist)存储
1. 存储数组或字典
// 存储数组到plist文件
NSArray *array = @[@"item1", @"item2", @"item3"];
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"data.plist"];
[array writeToFile:filePath atomically:YES];
// 读取数组
NSArray *arrayFromFile = [NSArray arrayWithContentsOfFile:filePath];
2. 存储字典到plist文件
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"Jane" forKey:@"name"];
[dict setObject:@"123456" forKey:@"phone"];
[dict setObject:@27 forKey:@"age"];
[dict writeToFile:filePath atomically:YES];
// 读取字典
NSDictionary *dictFromFile = [NSDictionary dictionaryWithContentsOfFile:filePath];
四、偏好设置(NSUserDefaults)
1. 保存数据
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"password" forKey:@"pwd"];
[defaults setBool:YES forKey:@"isOn"];
[defaults setInteger:10 forKey:@"num"];
2. 读取数据
NSString *pwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"pwd"];
BOOL isOn = [[NSUserDefaults standardUserDefaults] boolForKey:@"isOn"];
NSInteger num = [[NSUserDefaults standardUserDefaults] integerForKey:@"num"];
五、NSData归档和解档
使用NSData可以将多个对象归档到同一个文件中,也可以实现深复制。
1. 归档多个对象
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
[archiver finishEncoding];
[data writeToFile:filePath atomically:YES];
2. 解档多个对象
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
[unarchiver finishDecoding];
3. 实现自定义对象归档解档
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@end
Person.m
@implementation Person
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInt:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeIntForKey:@"age"];
}
return self;
}
@end
使用示例
Person *p = [[Person alloc] init];
p.name = @"John Doe";
p.age = 30;
// 归档
NSString *tempPath = NSTemporaryDirectory();
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
// 解档
Person *decodedPerson = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!