IOS 中NSUserDefaults读取和写入自定义对象的实现方法

发布时间 - 2026-01-11 03:17:42    点击率:

IOS 中NSUserDefaults读取和写入自定义对象的实现方法

NSUserDefaults可以存取一些短小的信息。

比如存入再读出一个字符串到NSUserDefaults:

NSString *string = [NSString stringWithString @"hahaha"]; 
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; 
[ud setObject:string forKey:@"myKey"]; 
NSString *value; 
value = [ud objectForKey:"myKey"]; 
 

但是并不是所有的东西都能往里放的。NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

 如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。不信可以试试,如果你成功的请告诉我。

那怎么办呢? 

我找到的方法是,让这个自定义类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。

粘代码:

假设有这样一个简单的类对象

@interface BusinessCard : NSObject <NSCoding>{ 
  NSString *_firstName; 
  NSString *_lastName; 
} 
@property (nonatomic, retain) NSString *_firstName; 
@property (nonatomic, retain) NSString *_lastName; 
@end; 
 
@implementation BusinessCard 
@synthesize _firstName, _lastName; 
- (void)dealloc{ 
  [_firstName release]; 
  [_lastName release]; 
  [super dealloc]; 
} 
- (id) initWithCoder: (NSCoder *)coder 
{ 
  if (self = [super init]) 
  { 
    self._firstName = [coder decodeObjectForKey:@"_firstName"]; 
    self._lastName = [coder decodeObjectForKey:@"_lastName"]; 
  } 
  return self; 
} 
- (void) encodeWithCoder: (NSCoder *)coder 
{ 
  [coder encodeObject:_firstName forKey:@"_firstName"]; 
  [coder encodeObject:_lastName forKey:@"_lastName"]; 
   
} 
 
@end 

然后再存取时通过NSData做载体:

BusinessCard *bc = [[BusinessCard alloc] init]; 
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; 
NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:bc]; 
[ud setObject:udObject forKey:@"myBusinessCard"]; 
[bc release]; 
udObject = nil; 
udObject = [ud objectForKey:@"myBusinessCard"]; 
bc = [NSKeyedUnarchiver unarchiveObjectWithData:udObject] ; 

以上的代码时由另一个程序中截取的,没有测试过,但意思就是这样了。

如果一个自定义类中由另一个自定义类对象,那么所有嵌套的类都要实现<NSCoding>。

如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# NSUserDefaults读取和写入自定义对象  # IOS中NSUserDefaults的使用方法  # iOS 本地存储NSUserDefaults封装代码  # iOS数据持久化KeyChain数据操作详解  # iOS用两行代码完美解决数据持久化  # iOS数据持久化UserDefaults封装器使用详解  # 自定义  # 然后再  # 如果你  # 告诉我  # 都要  # 如有  # 都能  # 希望能  # 不信  # 这样一个  # 谢谢大家  # 往里  # 或到  # 类中  # 把该  # 再读  # 疑问请  # NSArray  # 类存到  # NSDate 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: java ZXing生成二维码及条码实例分享  如何快速搭建虚拟主机网站?新手必看指南  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何基于云服务器快速搭建个人网站?  IOS倒计时设置UIButton标题title的抖动问题  jQuery validate插件功能与用法详解  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  如何有效防御Web建站篡改攻击?  详解Oracle修改字段类型方法总结  linux写shell需要注意的问题(必看)  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  如何在香港服务器上快速搭建免备案网站?  如何在IIS管理器中快速创建并配置网站?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  详解jQuery停止动画——stop()方法的使用  ,怎么在广州志愿者网站注册?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel storage目录权限问题_Laravel文件写入权限设置  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  JavaScript如何实现错误处理_try...catch如何捕获异常?  清除minerd进程的简单方法  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  利用 Google AI 进行 YouTube 视频 SEO 描述优化  香港服务器建站指南:免备案优势与SEO优化技巧全解析  JavaScript模板引擎Template.js使用详解  如何在 React 中条件性地遍历数组并渲染元素  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何快速生成凡客建站的专业级图册?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Python高阶函数应用_函数作为参数说明【指导】  Java遍历集合的三种方式  Laravel如何处理异常和错误?(Handler示例)  Laravel如何实现API速率限制?(Rate Limiting教程)  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel如何使用Blade组件和插槽?(Component代码示例)  高防服务器租用指南:配置选择与快速部署攻略  米侠浏览器网页背景异常怎么办 米侠显示修复  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程