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

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>。

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

(0)

相关推荐

  • iOS中NSInvocation的基本用法教程

    前言 大家应该都有所了解,在 iOS中可以直接调用某个对象的消息方式有两种:一种是performSelector:withObject:再一种就是NSInvocation. 第一种方式比较简单,能完成简单的调用.但是对于>2个的参数或者有返回值的处理,那performSelector:withObject就显得有点有心无力了,那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作 NSInvocation的基本使用 方法签名类 // 方法签名中保存了方法的名称/参数/返

  • IOS开发之手势响应事件优先级的实例详解

    IOS开发之手势响应事件优先级的实例详解 交互响应事件都是通过手势的操作完成的,如点击.或双击.或长按,这些交互都是在视图中完成的,但是不同的视图可能会有不同的交互,有时候就会出现交互响应事件冲突的情况.这时候就需要处理事件优先级,以便达到想要的效果. 示例场景:一个自定义模式视图view中,有一个列表视图table,同时有一个确定的按钮视图button:在view中有一个单击事件UITapGestureRecognizer,在table中点击每个cell也会有点击事件,同样的button中有个

  • ios微信浏览器返回不刷新问题完美解决方法

    开始用的表单提交,返回参数就丢失,换成url跳转,popstate监听 (注释部分)ios10测试始终有问题,继续搜,最后用pageshow,pagehide完美解决(另外说一句:珍爱生命,远离微信和ios) var wxback = { init :function(){ //隐藏微信分享按钮等 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { WeixinJSBridge.call('hid

  • JS解决IOS中拍照图片预览旋转90度BUG的问题

    上篇文章[Js利用Canvas实现图片压缩功能]中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度.对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编程了.通过度娘找到了相关资料,解决方法记录在此.这个问题的具体因素其实我还是不清楚是为何导致的,只有IOS和部分三星手机会出现此bug. 绝大部分的安卓机并无此问题. 解决此问题需要引入一个第三方 JS 库: exif.js 下载地址:https://github.com/exif-js/exif-

  • iOS开发之TextField禁用粘贴、选择和全选功能

    众所周知,TextField默认情况下,双击会出现"Paste"等提示复制粘贴的快捷菜单,方便用户快速编辑文本,但很多情况下,我们并不希望用户能够粘贴文本[虽然这样不友好,但万一产品经理要这么实现呢?],那么我们可以这样做: 方法 自定义TextField 重写canPerformAction方法 class CustomTextField: UITextField { /// 是否只是用于显示(禁用粘贴.选择和全选功能) var displayOnly = false /// 禁用粘

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

    IOS 中NSUserDefaults读取和写入自定义对象的实现方法 NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: NSString *string = [NSString stringWithString @"hahaha"]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [ud setObject:string forKey:@"m

  • python 自定义对象的打印方法

    在python中,如果不重写自定义对象的__str__方法,打印出来的对象是一串类似于<__main__.Bean object at 0x1007da470>的字符串.这当然不是我们想要的结果. 于是:通过对__str__方法的重写,就可以返回我们想要的数据的展示. 但是,一个新的问题出现了.以后,如果要修改这个类的属性,那么要想正确的显示对象的属性.还得修改__str__方法. 有没有办法可以做到动态显示所有的属性呢? 当然是有的. 通过对对象的属性的收集,就可以实现动态的打印全部的属性.

  • c++读取和写入TXT文件的整理方法

    如下所示: #include "stdafx.h" #include <iostream> //无论读写都要包含<fstream>头文件 #include <fstream> #include <iomanip> using namespace std; int main() { //ifstream从文件流向内存的ifstream表示文件输入流,意味着文件读操作 ifstream myfile("c://a.txt"

  • 详解Python读取和写入操作CSV文件的方法

    目录 什么是 CSV 文件? 内置 CSV 库解析 CSV 文件 读取 CSV 文件csv 将 CSV 文件读入字典csv 可选的 Python CSV reader参数 使用 csv 写入文件 从字典中写入 CSV 文件csv 使用 pandas 库解析 CSV 文件 pandas 读取 CSV 文件 pandas 写入 CSV 文件 最流行的数据交换格式之一是 CSV 格式.是需要通过键盘和控制台以外的方式将信息输入和输出的程序,通过文本文件交换信息是在程序之间共享信息的常用方法. 这里带和

  • iOS中UIAlertView3秒后消失的两种实现方法

    一,效果图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIAlertView* alert = [[UIAlertView alloc]initWithTitle:nil message:@"此信息3秒后消失" delegate:nil cancelButtonTitle:nil ot

  • JS创建自定义对象的六种方法总结

    1.创建一个 Object 实例 var person = new Object(); person.name = "rose"; person.age = 18; person.job = "actor"; person.sayName = function () { console.log(this.name); }; console.log(person); 2.对象字面量 var person = { name: "rose", age:

  • iOS中Xcode 8 日志输出乱码问题的解决方法

    更新到Xcode 8的同学应该都遇到了这个问题:用Xcode 8运行项目,日志会疯狂的刷,就像下面这种图一样: 日志输出 于是,简单搜寻了下,"歪果仁"给出了如下解决方法: Edit Scheme-> Run -> Arguments, 在Environment Variables里边添加 OS_ACTIVITY_MODE = disable 以上所述是小编给大家介绍的iOS中Xcode 8 日志输出乱码问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复

  • iOS中textField限制字符串长度、字符数的方法

    前言 最近在开发的时候遇到一个问题,就是需要限制TextField中输入的字符串的长度,但是不是直接根据长度限制,而是根据字符数限制,一个汉字为两个字节,数字字母为一个字符.超过字符限制则不允许继续输入并弹出toast提示. 这个问题有三个关键点:判断字符串是否超出长度,超出长度不可输入,判断字符串的字符数. 下面话不多说了,来一起看看详细的介绍吧 方法如下: 1.判断字符串是否超出长度 [self.txfUsername addTarget:self action:@selector(text

  • Python中的类的定义和对象的创建方法

    目录 1.创建类和创建类对象 2.新式类与旧式(经典)类 面向对象中两个重要的概念: 1.类   :对一类事物的描述,是抽象的.概念上的定义.比如做石膏像的模型2.对象:实际存在的该类事物的每个个体,因而也称实例(instance).比如石膏像二者的关系:对象是由类派生的.创建的.一个类可以创建无穷多个对象,每个对象都属于类. 1.创建类和创建类对象 1.创建类,类主要由类名,属性,方法组成,当然创建一个类时,属性和方法可以选择的. class Person: def cry(self): #类

  • javascript中自定义对象的属性方法分享

    首先介绍下关联数组: 复制代码 代码如下: <script> var test=new Object(); test["a"]=1; test["b"]="string"; test["c"]=false; alert(test["a"]); </script> 执行上面的代码,显示1.在javascript中,方法和属性一样当做值来看待. 复制代码 代码如下: <script

随机推荐