NSArray *myPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //NSDocumentDirectory 是表示沙盒里 document 文件夹的列表 //NSDocumentionDirectory 是 获取 沙盒里 library 里 documention里的文件夹列表 NSString *path=[myPaths objectAtIndex:0]; // objectAtIndex : 为document 的文件列表 NSString *filename=[path stringByAppendingPathComponent:@"properties.plist"]; -(IBAction)save:(id)sender { NSArray *myPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path=[myPaths objectAtIndex:0]; NSString *filename=[path stringByAppendingPathComponent:@"properties.plist"]; NSMutableArray *array=[[NSMutableArray alloc] init]; [array addObject:txt_name.text]; [array addObject:txt_class.text]; [array addObject:txt_id.text]; [array writeToFile:filename atomically:YES]; NSLog(@"come here"); } -(IBAction)read:(id)sender { NSArray *mypaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path=[mypaths objectAtIndex:0]; NSString *filename=[path stringByAppendingPathComponent:@"properties.plist"]; if([[NSFileManager defaultManager] fileExistsAtPath:filename]) { NSLog(@"it's ok"); NSMutableArray *array=[[NSMutableArray alloc] initWithContentsOfFile:filename]; txt_name.text=[array objectAtIndex:0]; txt_class.text=[array objectAtIndex:1]; txt_id.text=[array objectAtIndex:2]; } } 以上是保存到 plist 文件里,但是plist 的文件类型有限制,假如是自定义类的话,难以满足需求。 所以有序列化和反序列化 NSKeyedArchiver 和 NSKeyedUnarchiver 创建一个类 然后 添加两个协议 <NSCoding> //将对象写入文件中 -(void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:studentid forKey:@"stuid"]; [aCoder encodeObject:studentname forKey:@"stuname"]; [aCoder encodeObject:studentclass forKey:@"stuclass"]; } //从文件中读取对象 -(id)initWithCoder:(NSCoder *)aDecoder { self.studentid=[aDecoder decodeObjectForKey:@"stuid"]; self.studentname=[aDecoder decodeObjectForKey:@"stuname"]; self.studentclass=[aDecoder decodeObjectForKey:@"stuclass"]; return self; } 然后在事件中的 -(IBAction)save:(id)sender { NSArray *myPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path=[myPaths objectAtIndex:0]; NSString *filename=[path stringByAppendingPathComponent:@"student.archive"]; NSMutableData *data=[NSMutableData data]; //NSkeyedArchiver 是将 data 变成 二进制 文件 NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; student *stu=[[student alloc] init]; stu.studentid=txt_id.text; stu.studentname=txt_name.text; stu.studentclass=txt_class.text; //写入到文件 NSLog(@"%@",stu.studentname); [archiver encodeObject:stu forKey:@"stu"]; // encodeObject:stu 是调用了 上面的 encodeObject :aCoder 方法 [archiver finishEncoding]; [data writeToFile:filename atomically:YES]; NSLog(@"%@",data); } -(IBAction)read:(id)sender { NSArray *myPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path=[myPaths objectAtIndex:0]; NSString *filename=[path stringByAppendingPathComponent:@"student.archive"]; NSData *data=[NSData dataWithContentsOfFile:filename]; NSLog(@"%@",data); if([data length]>0) { NSKeyedUnarchiver * archiver=[[NSKeyedUnarchiver alloc]initForReadingWithData :data]; student *stu= [archiver decodeObjectForKey:@"stu"]; //decodeObjectForKey 是调用上面 decodeObjectForKey:aCoder方法 txt_name.text=stu.studentname; txt_id.text=stu.studentid; txt_class.text=stu.studentclass; } }