<NSCODING> 存储数据 NSUSERDEFAULTS 读取和写入

翻译 2013年12月05日 11:19:09

<NSCODING> 存储数据 NSUSERDEFAULTS 读取和写入

NSUserDefaults读取和写入自定义对象 
NSUserDefaults可以存取一些短小的信息。

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



view plaincopy to clipboardprint?
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中进行读取。

粘代码:

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



view plaincopy to clipboardprint?
@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做载体:



view plaincopy to clipboardprint?
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] ;  

ios开发——NSCoding协议与NSUserDefaults相关

NSCoding协议与NSUserDefaults相关       对于自定义的类,当要缓存对象时,会发现NSUserDefaults不能使用。并不是所有的东西都能往NSUserDefaults里面放...
  • u012881779
  • u012881779
  • 2013年12月20日 19:18
  • 851

NSUserDefaults数据存储总结

NSUserDefaults用法详解 1.NSUserDefaults是一个单例类,可以用于数据的永久保存, 一般用于保存应用程序设置以及用户数据等轻量级数据, 而且简单实用。 2.NSU...
  • st646889325
  • st646889325
  • 2016年12月07日 09:10
  • 377

关于NSUserDefaults保存数据的问题总结

大家都知道,NSUserDefaults适合存储轻量级的本地数据,并且在不删除程序的情况下是永久保存的。 NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、D...
  • mgr406176009
  • mgr406176009
  • 2016年08月17日 16:19
  • 2033

ios 沙盒 NSCoding 归档 数据存储

NSCoding 跟其他存储方式略有不同,他可以存储对象 对象存储的条件是: 对象需要遵守 NSCoding 协议 存储的时候需要 调用 encodeWithCoder 方法 读取的时候需要调用ini...
  • codywangziham01
  • codywangziham01
  • 2014年05月08日 17:29
  • 6616

NSUserDefaults轻量级永久存储数据使用介绍

/** * NSUserDefaults 它是OC中一种单例对象,在一个工程里面(一个程序里面),它只有一个实例对象。无论你创建多少次,结果指针都会指向同一个地址,也就是只有一个实例对象...
  • liushihua147
  • liushihua147
  • 2015年05月09日 18:02
  • 704

IOS 文件目录及NSUserDefaults浅谈

1.IOS文件目录 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app...
  • crycheng
  • crycheng
  • 2014年03月27日 14:15
  • 9808

NSUserDefaults 使用和原理

NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象.
  • hurosezhang
  • hurosezhang
  • 2016年01月12日 10:54
  • 648

iOS NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是...
  • SUMMER_csdn123
  • SUMMER_csdn123
  • 2017年05月26日 12:21
  • 648

NSUserDefaults类的使用—— 专门用于保存用户偏好设置或用户Model

介绍:NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等。如果要使用NSUserDefaults存储自定义的对象还需要进行特定的处理。 一、...
  • u013087513
  • u013087513
  • 2015年09月27日 22:09
  • 1381

swift学习笔记(一)NSUserDefaults存储对象的方法

在处理Swift持久化内容的时候,使用到了NSUserDefaults来保存数据,但是在实现过程中发现正常的对象无法保存,会报很多错,对象如下(简单的Student对象) class Student ...
  • love_qy
  • love_qy
  • 2015年09月23日 11:50
  • 368
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:<NSCODING> 存储数据 NSUSERDEFAULTS 读取和写入
举报原因:
原因补充:

(最多只允许输入30个字)