NSUserDefaults的一些用法

本文详细介绍了如何使用NSUserDefaults存储和读取不同类型的数据,包括基本数据类型、数组及自定义模型。特别关注了存储可变数组和自定义模型时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSUserDefaults是一个单例,整个程序中只有一个实例化对象。
NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL。
不支持自定义的Model类型。
如保存一个NSString的数据,可以用

NSString *passWord = @"123456";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];

读取数据时,用

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [user objectForKey:@"userPassWord"];

需要注意的是,对于相同key的多次赋值,相当于多次覆盖,所以要保证key的唯一性。

NSUserDefaults存储的对象全是不可变的。如想存储NSMutableArray的数据时,必须先创建一个不可变数组NSArray,再将它存入NSUserDefaults。如:

NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"存储的一定是不可变的"]; 

读取数据时,可以用NSUserDefaults对可变数组赋值。但要注意

/*-------------------------错误的赋值方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//这样写后,mutableArray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug
NSMutableArray *mutableArray = [user objectForKey:@"存储的一定是不可变的"];

正确的做法为:

/*-------------------------正确的赋值方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"存储的一定是不可变的"]];

 

在存储自定义Model时,往往一个对象有多个属性,如User有name,age,sex等属性。但NSUserDefaults不支持自定义Model,需要先将其转化为NSData。如:
先建个User类,

@interface User:NSObject
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *age;
@end

若要将User转化为NSData,就需要遵守NSCoding协议 ,在.m中实现encodeWithCoder和
initWithCoder方法。
所以修改如下:

@interface User:NSObject<NSCoding>
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *age;
@end

在.m中

@implementation User
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.age forKey:@"age"];
}

-(id)initWithCoder:(NSCoder *) aDecoder{
    if(self = [super init]){
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeObjectForKey:@"age"];
    }
    return self;
}

@end

 

然后将自定义类型存入NSUserDefaults中,可以建一个NSMutableArray存储所有的User。

User *user = [[User alloc] ini];
//下面进行的是对user对象的 name ,age的赋值
user.name = @"somebody";
user.age = @"12";
//这是一个存放所有用户的数组
NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];
//将user类型变为NSData类型
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];
//存放数据的数组将data加入进去    
[dataArray addObject:data];

若只想存储一个人的信息,可以直接将NSData存入NSUserDefaults中

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user];   
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:data forKey:@"oneUser"];

从NSData中还原数据也很简单,如

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSdData *data = [user objectForKey:@"oneUser"];
User *user = [NSKeyedUnarchiver unarchiveObjectWithData:data];

 

转载于:https://www.cnblogs.com/Apologize/p/4564153.html

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值