[数据存储之二]NSUserDefaults练习

原创 2015年12月18日 13:15:32
//  TestCodingProtocol.h
//  block练习
#import <Foundation/Foundation.h>

@interface TestCodingProtocol : NSObject<NSCoding>
#pragma mark- 持久化属性
@property(nonatomic,copy,readwrite) NSString* myName;
@property(nonatomic,assign,readwrite)NSInteger myIndex;
#pragma mark- 实现协议方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

@end

@interface TestCodingProtocolChild : TestCodingProtocol

@property(nonatomic,assign,readwrite) NSInteger myIndexChild;
-(void)encodeWithCoder:(NSCoder *)aCoder;
-(id)initWithCoder:(NSCoder *)aDecoder;

@end
//  TestCodingProtocol.m
//  block练习

#import "TestCodingProtocol.h"

@implementation TestCodingProtocol

-(void)encodeWithCoder:(NSCoder *)aCoder
{
    if (aCoder) {
        [aCoder encodeObject:self.myName forKey:@"myName"];
        //self.myIndex为基础类型,不能用encodeObject
        [aCoder encodeInteger:self.myIndex forKey:@"myIndex"];
    }
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        if (!aDecoder) {
            return self;
        }
        self.myName = [aDecoder decodeObjectForKey:@"myName"];
        self.myIndex = [aDecoder decodeIntegerForKey:@"myIndex"];
    }
    return self;
}
@end

@implementation TestCodingProtocolChild

-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [super encodeWithCoder:aCoder];
    [aCoder encodeInteger:self.myIndexChild forKey:@"myIndexChild"];
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {//这里如果用init的话,父类的内容得不到初始化。
        if (!aDecoder) {
            return self;
        }
        self.myIndexChild = [aDecoder decodeIntegerForKey:@"myIndexChild"];
    }
    return self;
}
@end
 TestCodingProtocol* t = [[TestCodingProtocol alloc] init];
    t.myIndex = 5;
    t.myName = @"hello";
    
    TestCodingProtocolChild* tChild = [[TestCodingProtocolChild alloc] init];
    tChild.myIndex = 6;
    tChild.myName = @"child";
    tChild.myIndexChild = 7;
    //增加几个基础类型。
    NSString* s = @"helloworld";
    NSNumber* n = [NSNumber numberWithInteger:5];
    NSDate*   d = [NSDate date];
    NSData* dt = [NSKeyedArchiver archivedDataWithRootObject:t];
    NSData* dChild = [NSKeyedArchiver archivedDataWithRootObject:tChild];
    NSArray*  r = [NSArray arrayWithObjects:s,n,d, nil];

    NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];
    [ud setObject:r forKey:@"myData"];     //这里如果r里面带自己的类型实例的话,也不行,要转换成NSData
    [ud setObject:dt forKey:@"dt"];        //如果这个dt放入r里面,解析的时候就找不到特殊的标志了。
    [ud setObject:dChild forKey:@"dChild"];//这三句话在第二次进入前屏蔽掉,也能读到,说明已经存储了。
    
    
    id er = [ud objectForKey:@"myData"];
    id et = [ud objectForKey:@"dt"];
    id etChild = [ud objectForKey:@"dChild"];
    if (et && [et isKindOfClass:[NSData class]]) {
        TestCodingProtocol* buf = [NSKeyedUnarchiver unarchiveObjectWithData:et];
        NSLog(@"myIndex is %ld, myName is %@", buf.myIndex, buf.myName);
    }
    if (etChild && [etChild isKindOfClass:[NSData class]]) {
        TestCodingProtocolChild* buf  = [NSKeyedUnarchiver unarchiveObjectWithData:etChild];
        NSLog(@"myIndex is %ld, myName is %@, myIndexChild is %ld", buf.myIndex, buf.myName, buf.myIndexChild);
    }
    if ([er isKindOfClass:[NSArray class]]) {
        NSEnumerator* e = [er objectEnumerator];
        id obj;
        while (obj = [e nextObject]) {
            if ([obj isKindOfClass:[TestCodingProtocolChild class]]) {
                NSLog(@"%@ 123",obj);
            }
            NSLog(@"%@",obj);
        }
    }
总结下吧:

1,这个nsuserdefaults支持nsstring,nsdata,nsnumber,nsarray,nsdictionary。

2,自己定义的类还的借助于nskeyedarchiver和nskeyedunarchiver进行与nsdata的转换,如果直接用nskeyedarchiver也可以,见coding协议练习。

3,保存文件的位置目前还没有找到~~

参考http://blog.csdn.net/chyroger/article/details/5785297

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liyanq528/article/details/50351115

IOS 中NSUserDefaults的用法(轻量级本地数据存储)

NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。下次再登陆的时候就可以直接从NSUserDefa...
  • yuqingzhude
  • yuqingzhude
  • 2015-09-15 11:22:45
  • 547

swift 数据存储 · NSUserDefaults存储配置信息

swift 数据存储 · NSUserDefaults存储配置信息NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传...
  • Lion_kuo
  • Lion_kuo
  • 2016-04-21 11:40:44
  • 1112

iOS开发 实现本地数据存储的几种方式一

iOS常用的存储方式介绍      在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置、需要在本地缓存的数据等等。本文针对OC中经常使用的一下存储方式做了个...
  • GuoGrower
  • GuoGrower
  • 2017-02-24 09:26:36
  • 515

iOS学习(三十三)使用NSUserDefaults简单的登陆界面保存用户名,下次启动并显示出来

使用NSUserDefaults简单的登陆界面保存用户名,下次启动并显示出来#import "ViewController.h"@interface ViewController ()@end@imp...
  • android_it
  • android_it
  • 2016-07-12 23:21:05
  • 607

Swift - 使用NSUserDefaults来进行本地数据存储

NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名、密码。使用NSUserDefaults是首选。下次再登陆的时候就可以直接从NSUserDefaul...
  • cos_sin_tan
  • cos_sin_tan
  • 2016-06-11 10:00:44
  • 936

swift中NSUserDefaults的用法(轻量级本地数据存储)

NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。 NSUserDefaults支持的数据格式有:...
  • u012605629
  • u012605629
  • 2014-12-28 14:35:42
  • 2045

Mac开发中NSUserDefaults用法解析

本文主要介绍在Mac开发过程中, 我们使用NSUserDefaults的场景, 对NSUserDefaults几种比较典型的使用形式进行对比解析, 希望对NSUserDefaults具体用法不是很清楚...
  • wlaizff
  • wlaizff
  • 2016-03-13 16:57:47
  • 1459

NSUserDefaults(数据存储)

一、在 AppDelegate.m 中引新建视图控制器的头文件 #import “MainViewController.h” 并创建 二、在新建的视图控制器 MainViewController 的...
  • XuesongYu
  • XuesongYu
  • 2015-04-23 11:41:22
  • 113

IOS 文件目录及NSUserDefaults浅谈

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

NSUserDefaults数据存储

数据存储 NSString *passWord = @"1234567"; NSUserDefaults *user = [NSUserDefaults standardUserDefau...
  • yongweish
  • yongweish
  • 2015-06-28 16:11:43
  • 228
收藏助手
不良信息举报
您举报文章:[数据存储之二]NSUserDefaults练习
举报原因:
原因补充:

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