1.软文推荐

2.软文推荐

3.软文推荐

ios微信文件储存在哪一。使用属性列表保存对象:在cocoa中,有一类对象称为属性列表,通常称为plist。这些列表包含一组cocoa知道如何操作的对象。具体来说,cocoa知道如何苹果微信下载...

1、使用属性列表保存对象:在Cocoa中,与一类名为属性列表的对象,常简称为plist。

这些列表包含Cocoa知道如何操作的一组对象。

具体来讲,Cocoa知道如何将它们保存到文件中并进行加载。

属性列表类包括:NSArray,NSDictionary,NSString和NSData,以及它们的变体(Mutable)NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];NSArray*array=[NSArrayarrayWithObjects:@First,@second,@third,@fourth,@fifth,nil];[arraywriteToFile:@array.plistatomically:YES];2、编码对象遗憾的是,无法总是将对象信息表示为属性列表类。

如果能将所有对象都表示为数组字典,我们就没有必要使用自己的类了。

所幸,Cocoa具备一种机制来将对象自身转化为某种格式并保存到磁盘中。

对象可以将它们的实例变量和其它数据编码为数据块,然后保存到磁盘中。

遗憾将这些数据块读到内存中,并且还能基于保存的数据创建新对象。

这个过程称为编码和解码,或称为序列化和反序列化。

通过NSCoding协议,可以使用自己的对象实现相同功能,实现它的两个方法:-(void)encodeWithCoder:(NSCoder*)aCoder;-(id)initWithCoder:(NSCoder*)aDecoder;NSCoder是一个抽象类,定义一些有用的方法来在对象与NSData之间来回转换。

完全不需要创建新NSCoder,因为它事件上并无多大作用。

但是我们实际上要使用NSCoder的一些具体子类来编码和解码对象。

我们将使用其中两个子类NSKeyedArchiver和NSKeyedUnArchiver.下面是一个例子:头文件类BookObj.h的源码:////BookObj.h//#importCocoa/Cocoa.h@interfaceBookObj:NSObjectNSCoding{NSString*bookName;NSString*author;}@property(copy)NSString*bookName;@property(copy)NSString*author;-(id)initWithName:(NSString*)nameauthor:(NSString*)au;实现类BookObj.m的源码:////BookObj.m//#importBookObj.h@implementationBookObj@synthesizebookName;@synthesizeauthor;-(id)initWithName:(NSString*)nameauthor:(NSString*)au{if(self=[superinit]){self.bookName=name;self.author=au;}returnself;}-(void)encodeWithCoder:(NSCoder*)aCoder{[aCoderencodeObject:self.bookNameforKey:@bookName];[aCoderencodeObject:self.authorforKey:@author];}-(id)initWithCoder:(NSCoder*)aDecoder{if(self=[superinit]){self.bookName=[aDecoderdecodeObjectForKey:@bookName];self.author=[aDecoderdecodeObjectForKey:@author];}returnself;}intmain(intargc,constchar*argv[]){BookObj*bookObj=[[BookObjalloc]initWithName:@iPhone编程指南author:@David];[NSKeyedArchiverarchiveRootObject:bookObjtoFile:@bookObj.plist];NSLog(@SuccesstoarchivefilebookObj.plist!);BookObj*bookOb=[NSKeyedUnarchiverunarchiveObjectWithFile:@bookObj.plist];NSLog(@Thebooknameis:%@,bookOb.author);return0;}@end/==============================================================下面镔哥具体介绍一下plist文件和NSCoding协议在做iOS开发时,经常用到到plist文件,那plist文件是什么呢?

它全名是:PropertyList,属性列表文件,它是一种用来存储串行化后的对象的文件。

属性列表文件的扩展名为.plist,因此通常被称为plist文件。

文件是xml格式的。

Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息1、创建项目Plistdemo项目创建之后可以找到项目对应的plist文件,打开如下图所示:

在编辑器中显示类似与表格的形式,可以在plist上右键,用源码方式打开,就能看到plist文件的xml格式了。

2、创建plist文件。

按commandN快捷键创建,或者FileNewNewFile,选择MacOSX下的PropertyList

创建plist文件名为plistdemo。

打开plistdemo文件,在空白出右键,右键选择Addrow添加数据,添加成功一条数据后,在这条数据上右键看到valueType选择Dictionary。

点加号添加这个Dictionary下的数据

添加完key之后在后面添加Value的值,添加手机号和年龄创建完成之后用sourcecode查看到plist文件是这样的:?xmlversion=1.0encoding=UTF-8?!DOCTYPEplistPUBLIC-//Apple//DTDPLIST1.0//ENhttp://www.apple.com/DTDs/PropertyList-1.0.dtdplistversion=1.0dictkeyjack/keydictkeyphone_num/keystring13801111111/stringkeyage/keystring22/string/dictkeytom/keydictkeyphone_num/keystring13901111111/stringkeyage/keystring36/string/dict/dict/plist3、读取plist文件的数据现在文件创建成功了,如何读取呢,实现代码如下:-(void)viewDidLoad{[superviewDidLoad];//读取plistNSString*plistPath=[[NSBundlemainBundle]pathForResource:@plistdemoofType:@plist];NSMutableDictionary*data=[[NSMutableDictionaryalloc]initWithContentsOfFile:plistPath];NSLog(@%@,data);//直接打印数据。

}打印出来的结果:[cpp]viewplaincopyPlistDemo[6822:f803]{jack={age=22;phone_num=13801111111;};tom={age=36;phone_num=13901111111;};}这样就把数据读取出来了。

4、创建和写入plist文件在开发过程中,有时候需要把程序的一些配置保存下来,或者游戏数据等等。

这时候需要写入Plist数据。

写入的plist文件会生成在对应程序的沙盒目录里。

接着上面读取plist数据的代码,加入了写入数据的代码,strong-(void)viewDidLoad{[superviewDidLoad];//读取plistNSString*plistPath=[[NSBundlemainBundle]pathForResource:@plistdemoofType:@plist];NSMutableDictionary*data=[[NSMutableDictionaryalloc]initWithContentsOfFile:plistPath];NSLog(@%@,data);//添加一项内容[datasetObject:@addsomecontentforKey:@c_key];//获取应用程序沙盒的Documents目录NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*plistPath1=[pathsobjectAtIndex:0];//得到完整的文件名NSString*filename=[plistPath1stringByAppendingPathComponent:@test.plist];//输入写入[datawriteToFile:filenameatomically:YES];//那怎么证明我的数据写入了呢?

读出来看看NSMutableDictionary*data1=[[NSMutableDictionaryalloc]initWithContentsOfFile:filename];NSLog(@%@,data1);//Doanyadditionalsetupafterloadingtheview,typicallyfromanib.}/strong在获取到自己手工创建的plistdemo.plist数据后,在这些数据后面加了一项内容,证明输入写入了。

怎么证明添加的内容写入了呢?

下面是打印结果:

NSCoding协议由于Sqlite数据库的blob数据和NSData的兼容比较好,我想尝试把一个NSArray存入Sqlite。

Sqlite不支持数组的直接存储,所以我寻找了一些数组转化为NSData的方法。

网上大多数的解决办法都是针对于字符数组,eg:NSArray*array01=[[NSArrayalloc]initWithObjects:@1,@2,@3,nil];这种数组的解决办法很简单,循环遍历数组,然后把每次取出的NSString转码成NSData类型,然后对最终的NSData数据进行一次次的循环拼接,实现把数组中所有的字符串拼接成一个完整的NSData,eg:NSMutableData*data01=[[NSMutableDataalloc]init];for(NSString*strinarray01){NSString*newStr=[strstringByAppendingString:@,];//添加间隔,为了区分数组的每个元素NSData*temp=[newStrdataUsingEncoding:NSASCIIStringEncoding];//创建中间变量存储将nsstring转码成nsdata的数据[data01appendData:temp];//data数据拼接到最终数据data01上[temprelease];}这样就实现了一个NSArray字符数组到NSData的转换。

转换回来也很简单,把NSData转换成NSString,然后将NSString分割(这也就是我们为str添加末尾,的原因),eg:NSString*string01=[[NSStringalloc]initWithData:data01encoding:NSUTF8StringEncoding];//将NSData数据转换成NSString类型数据NSArray*array02=[string01componentsSeparatedByString:@,];//字符串根据@,拆分成一个数组,将数组还原但是这样太麻烦了,经过了这么多次转换,我就在思考有没有更简单的方法,NSData和NSArray的直接转换。

无意间看到了一个网站,我看到了一个方法,运用的是归档,下面我们来说一下这个方法的实现,eg:NSData*data02=[NSKeyedArchiverarchivedDataWithRootObject:array01];//通过归档对NSArray进行转码,保存了数组的序列一句代码就完成了!而且还保存了数组的有序性。

转换回去也同样是一句话哦:),eg:NSArray*array02=[NSKeyedUnarchiverunarchiveObjectWithData:data02];//通过发归档进行NSData反转码,返回有序列的数组是不是很方便呢?

不是很,是太方便了吧。

但是这个时候问题又来了,我如果在数组里存放的不是NSString类型的对象呢,如果存了自定义的类,是否也可以自动跳转呢?

(有点异想天开。

),于是我自己创建了一个Student类,尝试相同的方式转换,发现程序无法运行了,问了同事,他告诉了我这个秘密。

原来所有原生的类都是实现了NSCoding协议,在归档的过程中进行了转码,所以才可以归档成功。

我研究了一下NSCoding协议,下面是API给我们的信息:NSCodingProtocolReferenceencodeWithCoder:Encodesthereceiverusingagivenarchiver.(required)-(void)encodeWithCoder:(NSCoder*)encoderParametersencoderAnarchiverobject.AvailabilityAvailableiniOS2.0andlater.DeclaredInNSObject.hinitWithCoder:Returnsanobjectinitializedfromdatainagivenunarchiver.(required)-(id)initWithCoder:(NSCoder*)decoderParametersdecoderAnunarchiverobject.ReturnValueself,initializedusingthedataindecoder.AvailabilityAvailableiniOS2.0andlater.DeclaredInNSObject.hNSCoding协议中只有两个方法,都是require的方法,一个是把本身的类进行转码,一个是逆转换成类对象,返回一个对象,我们实战一下这个协议的用法,看看是否好用,首先写一个自定义Student类:@interfaceStudent:NSObjectNSCoding@property(nonatomic,retain)NSString*name;@property(nonatomic,retain)NSString*ID;-(Student*)initWithName:(NSString*)newNameand:(NSString*)newID;@endStudent类需要实现协议NSCoding,.m文件中是这样的:@implementationStudent@synthesizename=_name,ID=_ID;//初始化学生类-(Student*)initWithName:(NSString*)newNameand:(NSString*)newID{self=[superinit];if(self){self.name=newName;self.ID=newID;}returnself;}//学生类内部的两个属性变量分别转码-(void)encodeWithCoder:(NSCoder*)aCoder{[aCoderencodeObject:self.nameforKey:@name];[aCoderencodeObject:self.IDforKey:@ID];}//分别把两个属性变量根据关键字进行逆转码,最后返回一个Student类的对象-(id)initWithCoder:(NSCoder*)aDecoder{if(self=[superinit]){self.name=[aDecoderdecodeObjectForKey:@name];self.ID=[aDecoderdecodeObjectForKey:@ID];}returnself;}@end自定义类Student实现了NSCoding协议以后,就可以进行归档转换了,具体实现:Student*stu1=[[Studentalloc]initWithName:@124and:@111];//学生对象stu1Student*stu2=[[Studentalloc]initWithName:@223and:@222];//学生对象stu2NSArray*stuArray=[NSArrayarrayWithObjects:stu1,stu2,nil];//学生对象数组,里面包含stu1和stu2NSData*stuData=[NSKeyedArchiverarchivedDataWithRootObject:stuArray];//归档NSLog(@data=%@,stuData);NSArray*stuArray2=[NSKeyedUnarchiverunarchiveObjectWithData:stuData];//逆归档NSLog(@array2=%@,stuArray2);运行结果如下:2012-09-2510:44:24.944MagazineDemo[720:f803]data=62706c6973743030d40102030405082b2c5424746f7058246f626a65637473582476657273696f6e59246172636869766572d1060754726f6f748001aa090a111718192024252655246e756c6cd20b0c0d105a4e532e6f626a656374735624636c617373a20e0f800280068009d312130c141516524944546e616d658004800380055331323453313131d21a1b1c1f5824636c61737365735a24636c6173736e616d65a21d1e5753747564656e74584e534f626a6563745753747564656e74d312130c2122168008800780055332323353323232d21a1b272aa22829574e534172726179584e534f626a656374574e53417272617912000186a05f100f4e534b657965644172636869766572000800110016001f002800320035003a003c0047004d0052005d006400670069006b006d00740077007c007e008000820086008a008f009800a300a600ae00b700bf00c600c800ca00cc00d000d400d900dc00e400ed00f500fa0000000000000201000000000000002d0000000000000000000000000000010c2012-09-2510:44:24.944MagazineDemo[720:f803]array2=(Student:0x6883490,Student:0x68dd3c0)成功啦:)自定义类Student转码成功.

相关文章 8

1

微信指纹支付怎么关闭 1分钟前

今天小编要和大家分享的是微信指纹支付怎么关闭,希望能够帮助到大家。01、首先在我们的手机桌面上找到微信并点击它,如下图所示。...

2

知乎搜索没反应,知乎不能用了 3分钟前

知为什么知乎加载不了乎总是无响应... ?? 知乎是一个真实的网络问答社区,用户分享着彼此的专业知识、经验和见解。可最近有很多知乎用...

3

502BadGateway错误解决办法,网页显示502badgateway错误怎么解决 5分钟前

今天,当我打开电脑网页时,有一个502坏网关。计算机网页无法打开。小编也很担心。我们是怎么解决的?编辑带我们去解决这网页显示5...

4

大鱼号是怎么赚钱? 7分钟前

大鱼号是怎么赚钱的?下面就这个话题跟大家一起来说一下01、现在自媒体非常的火热,那么阿里巴巴投资的大鱼号这个自媒体也是深受自媒...

5

windows7忘记开机密码,windows7下如何设置电脑开机密码 9分钟前

如果你不想让别人使用电脑,设置密码是个不错的选择,但很多windows7怎么设置开机密码人不会设置。以下是如何设置电脑开机密码... 单击...

6

怎么更换和制作iphone铃声,iphone铃声制作及导入 10分钟前

将音乐(音频)文件转换为您的iPhone铃声,让您随如何制作IPhone铃声心所欲。... 装有Windows系统的机器。 音频文件 安装了光盘刻录大师7.2软...

7

怎么升级windows7,如何安装网络打印机(windows7为例) 12分钟前

Windows749打印机共享许多人不知道如何共享打印机。事实上,windows 7操作系统有自己的指导功能,可以指导用户逐步建立共享打印机。根据系...

8

怎么进入路由器管理界面修改wlan密码,磊科智能路由NO1[9]定时重启功能 14分钟前

现在,大多数互联网怎样查看路由器连接的人数用户都连接到无线路由器上。如果你用WiFi上网,速度很快,而且不消耗数据流量。然而,有...