[iOS]数据持久化-沙盒存储

一.沙盒机制
1.  每个应用程序位于文件系统的严格限制部分
2.  每个应用程序只能在为该程序创建的文件系统中读取文件
3.  每个应用程序在ios系统内都放在了统一的文件目录下
4.  沙盒路径的位置
1.  通过Finder查找程序沙盒相对路径
~/Library/ApplicationSupport/iPhone Simulator
2.  通过代码查找程序沙盒相对路径
NSSearchPathForDirectoriesInDomains(NSSearchPathDirectorydirectory, NSSearchPathDomainMask domainMask, BOOL expandTilde)

参数1:要搜索哪个文件夹(Document文件夹,tmp文件夹,Library文件夹)

参数2:获得iphone用户文件夹(固定为NSUserDomainMask)

参数3:YES(绝对路径)NO(相对路径)

// 获取沙盒路径
    NSArray *paths =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
简单对象的读写

- (void)writeString
{
    // 获取路径
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"path == %@",path);
    // 取出路径
    NSString *str = [path objectAtIndex:0];
    
    // 字符串拼接 创建文件 text.txt
    str = [NSString stringWithFormat:@"%@%@",str,@"/text.txt"];
    
    // 要写入的字符串
    NSString *value = @"蓝翔与杀马特的爱情史";
    
    // 写入文件
    NSError *error = nil;
    [value writeToFile:str atomically:YES encoding:NSUTF8StringEncoding error:&error];
    
    if (error) {
        NSLog(@"error == %@",error);
    }
}
#pragma mark - NSString 读取
- (void)readString
{
    NSError *error = nil;
    NSString *fileName = @"/text.txt";
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [pathArray objectAtIndex:0];
    
    path = [path stringByAppendingString:fileName];
    
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
    if (error) {
        NSLog(@"error == %@",error);
    }
    NSLog(@"str == %@",str);
}
复杂对象的读写

1.复杂对象遵循NSCoding协议

student.h

#import <Foundation/Foundation.h>
      // 1. 要存储对象 , 需要要遵循 NSCoding 协议
@interface Student : NSObject <NSCoding>

@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *sex;
@property (nonatomic,assign) NSInteger age;

- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;
+ (id)studentWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;
@end

2.重写NSCoding的两个方法

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

student.m

#import "Student.h"

@implementation Student
-(void)dealloc
{
    [_name release];
    [_sex release];
    _name = nil;
    _sex = nil;
    [super dealloc];
}
- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age
{
    if (self = [super init]) {
        self.name = name;
        self.sex = sex;
        self.age = age;
    }
    return self;
}
+ (id)studentWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age
{
    Student *stu = [[Student alloc] initWithName:name sex:sex age:age];
    return [stu autorelease];
}
#pragma mark - NSCoding 协议必须实现的两个方法

#pragma mark - 归档协议(序列化协议)对象---》二进制
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    //
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.sex forKey:@"sex"];
    
    NSNumber *num = [NSNumber numberWithInt:self.age];
    [aCoder encodeObject:num forKey:@"age"];
    
}
#pragma mark - 解档(反序列化)   二进制---》对象
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.sex = [aDecoder decodeObjectForKey:@"sex"];
        NSNumber *num = [aDecoder decodeObjectForKey:@"age"];
        self.age = [num intValue];
    }
    return self;
}
-(NSString *)description
{
    return [NSString stringWithFormat:@"姓名:%@,性别:%@,年龄:%d",_name,_sex,_age];
}
@end

MainViewController.m

#pragma mark - 复杂类型对象存储 ******************************************************************
//归档,即将自己创建的model类对象,转换为二进制格式,通过二进制格式进行存储。
- (void)archiveObject
{
    Student *stu = [Student studentWithName:@"蓝翔" sex:@"女" age:16];
    
    //归档,即将自己创建的model类对象,转换为二进制格式,通过二进制格式进行存储。
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stu];
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *str = [paths firstObject];
    str = [NSString stringWithFormat:@"%@/student",str];
    
    [data writeToFile:str atomically:YES];


}
// 解档,将归档后的二进制文件解档为相对应的model类型对象
- (void)unarchiveObject
{
    // 解档,将归档后的二进制文件解档为相对应的model类型对象
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *str = [paths firstObject];
    str = [NSString stringWithFormat:@"%@/student",str];
    
    NSData *data = [NSData dataWithContentsOfFile:str];
    
    Student *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"%@",model);
}

其它信息的存储方法

#pragma mark - 二进制存储 ************************
- (void)writeData
{
    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *str = [arr firstObject];
    str = [NSString stringWithFormat:@"%@/data",str];
    
    NSString *value = @"蓝翔被菊爆啦,听说没";
    
    // 转换成Data类型 二进制编码格式
    NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
    // 写入文件
    [data writeToFile:str atomically:YES];
    
}
- (void)readData
{
    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *str = [arr firstObject];
    str = [NSString stringWithFormat:@"%@/data",str];
    
    NSData *data = [NSData dataWithContentsOfFile:str];
    NSLog(@"data =  %@",data);
    
    NSString *value = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"string =  %@",value);
}
#pragma mark - 轻量级存储
#pragma mark - 存储登陆等信息
- (void)userDefaultsWrite
{
    // 单例对象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    [defaults setObject:@"蓝翔" forKey:@"name"];
    
    // 同步存储 默认异步
    [defaults synchronize];
    
}
#pragma mark - 获取存储登陆等信息 ******************************************************************
- (void)readUserDefaults
{
    NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
    NSLog(@"%@",value);
    // 任何地方都可以写
}





深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值