1,plist

Plist注意:不能存储自定义对象

Plist:数组和字典,
  如何判断一个对象能不能使用Plist,就看下有没有writeToFile

获取应用的文件夹(应用沙盒)

NSString* homePath=NSHomeDirectory();

获取temp

NSTemporaryDirectory();

获取Cache文件路径

NSSearchPathDirectory:搜索的目录

NSSearchPathDomainMask:搜索范围NSUserDomainMask表示在用户的手机上查找

expandTilde是否展开全路径,如果没有展开 应用沙盒的路径就~

存储一定要展开路径

获取文件存取路径,此处以cache为例

NSString* cachePath=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0];

拼接文件名称

NSString* filePath=[cachePath stringByAppendingPathComponent:@"personArr.plist"];

File:文件全路径 存

[arr writeToFile:filePath atomically:YES]

NSArray* arr=[NSArray arrayWithContentsOfFile:filePath];

 //
// ViewController.m
// 05-PIist存储
//
// Created by xiaomage on 15/6/13.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #import "ViewController.h"
#import "Person.h" @interface ViewController () @end @implementation ViewController
// 点击存储的时候调用
- (IBAction)save:(id)sender {
Person *p = [[Person alloc] init];
// Plist注意:不能存储自定义对象
// Plist:数组和字典,
// 如何判断一个对象能不能使用Plist,就看下有没有writeToFile
NSArray *arr = @[@"",@,p]; // 获取应用的文件夹(应用沙盒)
// NSString *homePath = NSHomeDirectory(); // 获取temp
// NSTemporaryDirectory(); // 获取Cache文件路径
// NSSearchPathDirectory:搜索的目录
// NSSearchPathDomainMask:搜索范围 NSUserDomainMask:表示在用户的手机上查找
// expandTilde 是否展开全路径,如果没有展开,应用的沙盒路径就是~
// 存储一定要要展开路径
NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[]; // 拼接文件名
NSString *filePath = [cachePaht stringByAppendingPathComponent:@"personArr.plist"]; NSLog(@"%@",cachePaht); // File:文件的全路径
[arr writeToFile:filePath atomically:YES]; } - (IBAction)read:(id)sender { NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[]; // 拼接文件名
NSString *filePath = [cachePaht stringByAppendingPathComponent:@"arr.plist"]; NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; NSLog(@"%@",arr); } - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

2偏好设置

好处:不用关心文件名称,快速做键值对存储,

底层:就是封装了一个字典

获取偏好设置对象

NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];

[userDefaults setObject:@"lxl" forKey:@"account"];

[userDefaults setBool:YES forKey:@"rmbPwd"];

iso7之前默认不会马上把缓存跟硬盘同步

要调用 [userDefaults synchronize];

默认生成一个plist文件 plist不能存自定对象

[userDefaults objectForKey:@"account"];

[userDefaults BoolForKey:@"rmbPwd"];

 //
// ViewController.m
// 06-偏好设置
//
// Created by xiaomage on 15/6/13.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController // 偏好设置存储:
// 好处:1.不需要关心文件名
// 2.快速做键值对存储 // 底层:就是封装了一个字典
// account:xmg pwd:123 rmbPwd:YES
- (IBAction)save:(id)sender { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"xmg" forKey:@"account"];
[userDefaults setObject:@"" forKey:@"pwd"];
[userDefaults setBool:YES forKey:@"rmbPwd"];
// 在iOS7之前,默认不会马上把跟硬盘同步
// 同步
[userDefaults synchronize]; }
- (IBAction)read:(id)sender {
NSString *pwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"pwd"]; NSLog(@"%@",pwd); } - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

3自定义对象存储

获取文件路径

NSString * filePath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0] stringByAppendingPathComponent:@"person.data"];

对象

Person* p=[[Person alloc]init];

[NSKeyedArchiver archiveRootObject:p toFile:filePath];

Person* p=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

一个自定义对象想要归档需要实现协议NSCoding,并实现协议的2个方法

描述对象的那些属性归档

- (void)encodeWithCoder:(NSCoder *)aCoder;

描述对象的那些属性解档

- (id)initWithCoder:(NSCoder *)aDecoder;

实现initWithCoder注意如果当前自定义类的父类没有实现NSCoding协议就不能调用super initWithCoder:

而是调 super init

通过xib,storyboard创建的页面会调用initWithCoder

通过代码创建的页面会调用initWithFrame

 //
// ViewController.m
// 07-自定义对象归档
//
// Created by xiaomage on 15/6/13.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #import "ViewController.h"
#import "Person.h" @interface ViewController () @end @implementation ViewController
- (IBAction)save:(id)sender { Person *p = [[Person alloc] init];
p.age = ; // 获取cache
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[]; // 获取文件的全路径
NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"]; // 把自定义对象归档
[NSKeyedArchiver archiveRootObject:p toFile:filePath]; }
- (IBAction)read:(id)sender { // 获取cache
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[]; // 获取文件的全路径
NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"]; // 解档
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSLog(@"%d",p.age); } - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
 //
// Person.h
// 07-自定义对象归档
//
// Created by xiaomage on 15/6/13.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #import <Foundation/Foundation.h> // 如果一个自定义对象想要归档,必须遵守NSCoding协议,实现协议方法。
@interface Person : NSObject<NSCoding>
@property (nonatomic, assign) int age;
@property (nonatomic, strong) NSString* name;
@end //
// Person.m
// 07-自定义对象归档
//
// Created by xiaomage on 15/6/13.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #import "Person.h" @implementation Person // 什么时候调用:自定义对象归档的时候 // 作用:用来描述当前对象里面的哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
// name
[aCoder encodeObject:_name forKey:@"name"]; // age
[aCoder encodeInt:_age forKey:@"age"]; } // 什么时候调用:解档对象的时候调用 // 作用:用来描述当前对象里面的哪些属性需要解档
// initWithCoder:就是用来解析文件的。
- (id)initWithCoder:(NSCoder *)aDecoder
{
// super:NSObject
#warning 什么时候需要调用initWithCoder
if (self = [super init]) { // 注意:一定要给成员变量赋值
// name
_name = [aDecoder decodeObjectForKey:@"name"]; // age
_age = [aDecoder decodeIntForKey:@"age"]; }
return self; } @end

ios存储 plist 偏好设置 自定义对象存储的更多相关文章

  1. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

  2. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  3. ios NSUserDefaults存储数据(偏好设置)

    ios NSUserDefaults存储数据(偏好设置) 1.NSUserDefaults用于存储数据量小的数据,主要是用户配置,但也可以支持存储一些小数据包括:NSString, NSNumber, ...

  4. IOS第13天(2,私人通讯录,plist存储,偏好设置,归档)

    ***************plist存储 // 当点点击保存的时候调用 //保存 - (IBAction)save:(id)sender { // 获取沙盒的根路径 // NSString *ho ...

  5. iOS开发-本地存储(偏好设置,Plist,归档)

    1.   NSUserDefaults //TODO: 1.NSUserDefaults NSUserDefaults类除了可以存储数组.字典.NSdata外,还可以直接存储OC基本类型属性.但是不能 ...

  6. ios应用数据存储方式(偏好设置)-转

    一.简单介绍 1.很多ios应用都支持偏好设置,比如保存用户名,密码,字体大小等设置,ios提供了一套标准的解决方案来为应用加入偏好设置功能. 2.每个应用都有个NSUserDefaults实例,通过 ...

  7. iOS 深拷贝、浅拷贝、自定义对象拷贝简介

    copy语法的目的:改变副本的时候,不会影响到源对象: 深拷贝:内容拷贝,会产生新的对象.新对象计数器置为1,源对象计数器不变. 浅拷贝:指针拷贝,不会产生新的对象.源对象计数器+1. 拷贝有下面两个 ...

  8. IOS获取preferreces偏好设置plistname名称的方法

    //获取preferreces偏好设置plistname名称的方法1 -(NSArray*)loadSpecifiersFromPlistName:(NSString*)plistName targe ...

  9. 数据存储之偏好设置NSUserDefaults

    NSUserDefaults做数据存储也是比较常用,适合轻量级的本地数据存储,读取也很方便. 一.支持的数据类型如下图(NSString.NSArray.NSDictionary.NSData.NSI ...

随机推荐

  1. FZU 2127 养鸡场

     Problem Description Jason买来了n米长的竹篱笆,打算将n米长的竹篱笆全部用来围成一个三角形的养鸡场.为方便起见,养鸡场三条边的长度都为正整数.同时,他想让自己的养鸡场看起来更 ...

  2. MFC控件

    控件的通知消息 控件的消息映射宏的格式大致是: ON_通知消息码(nID, memberFun) //nID参数是控件的ID,memberFun参数是消息处理函数名.例如,ON_BN_CLICKED( ...

  3. 转载:MATLAB画图常用调整代码

    %单y轴 plot(t*1e+,abs(iGG)/max(abs(iGG)),); axis([-,,,]) xlabel('时间/ns'); ylabel('幅度/a.u.'); ,'FontNam ...

  4. 50道经典的JAVA编程题 (11-15)

    50道经典的JAVA编程题 (11-15),新年的第一天,继续啦...\(^o^)/~,这50道题都跨年了啊...哈哈 [程序11] TestTN.java 题目:有1.2.3.4个数字,能组成多少个 ...

  5. Spark 0.9的安装配置

    一.上传scala2.10.3到linux 下载scala 2.10.3文件.网上的scala-2.10.3.tgz.scala-2.10.3.rpm,前者支持unix,后者专门给linux使用.但我 ...

  6. 基于adt-bundle的Android开发环境搭建

    web与移动是当今的热门,怎么说都得会一点,完全不懂是不行的. 一直想玩一下移动开发,穷屌丝暂时没有iPhone和Mac,所以先拿Android开刀. 之前也有想过玩一下Android,但是都被各种博 ...

  7. Unity3D实现简单的抽奖程序

    下面是具体的代码,注意,我这里用到了NGUI这个插件.大概的原理很简单,就用了2张图片Sprite,同时向下移动,当上面一张图片移动到下面一张图片原来的位置时,就把这2张图片向上移到初始的位置.这时, ...

  8. build-your-first-mobile-app(第一个 PhoneGap cordova Coldfusion App)

    摘自:http://www.adobe.com/devnet/coldfusion/articles/build-your-first-mobile-app.html Introduction Use ...

  9. Excel里的单元格提行

    最近老板发了个表,遇到了个小知识点,收藏以后有用!拿来学学 如下,是属于单元格.怎么提行? 直接,空格或space,都无法解决!...... 解决办法:Alt + Enter 成功! 参考: http ...

  10. Linux安装JDK详细步骤

    Linux安装JDK步骤 1.先从网上下载jdk(jdk-7u1-linux-i586.rpm),下载地址:http://www.oracle.com/technetwork/java/javase/ ...