如何保存plist到NSUserDefaults

我试图保存一个.plist我创build到我的NSUserDefaults以便我可以保存我所放入的数据,所以如果应用程序停止(从多任务栏中删除),我不会松散的值。

我已经在这里指出了这个教程

它有这个示例代码。

 -(void)saveToUserDefaults:(NSString*)myString { NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; if (standardUserDefaults) { [standardUserDefaults setObject:myString forKey:@"Prefs"]; [standardUserDefaults synchronize]; } } -(NSString*)retrieveFromUserDefaults { NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; NSString *val = nil; if (standardUserDefaults) val = [standardUserDefaults objectForKey:@"Prefs"]; return val; } 

我想要的一些帮助是如何剂量上面涉及保存.plists

我有一个.plist控制器类读取包.plist在根文档中创build一个新的.plist然后读取和写入…如何使用上述来保存应用程序退出或closures时?

这是我如何加载和写入我的.plist ,目前使用单数,并在它自己的类。

 #pragma mark Singleton Methods + (id)sharedManager { @synchronized(self) { if (sharedMyManager == nil) sharedMyManager = [[self alloc] init]; } return sharedMyManager; } - (id)init { if (self = [super init]) { // Data.plist code // get paths from root direcory NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // get documents path NSString *documentsPath = [paths objectAtIndex:0]; // get the path to our Data/plist file NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; // check to see if Data.plist exists in documents if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { // if not in documents, get property list from main bundle plistPath = [[NSBundle mainBundle] pathForResource:@"EngineProperties" ofType:@"plist"]; } // read property list into memory as an NSData object NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; NSString *errorDesc = nil; NSPropertyListFormat format; // convert static property liost into dictionary object NSDictionary *tempRoot = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; if (!tempRoot) { NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); } // assign values self.signature = [tempRoot objectForKey:@"Signature"]; self.version = [tempRoot objectForKey:@"Version"]; self.request = [tempRoot objectForKey:@"Request"]; self.dataVersion = [tempRoot objectForKey:@"Data Version"]; man = [cacheValue objectForKey:@"Man"]; mod = [cacheValue objectForKey:@"Mod"]; sub = [cacheValue objectForKey:@"SubMod"]; cacheValue = [tempRoot objectForKey:@"Cache Value"]; } - (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue; { // get paths from root direcory NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // get documents path NSString *documentsPath = [paths objectAtIndex:0]; // get the path to our Data/plist file NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; // set the variables to the values in the text fields self.signature = pSignature; self.version = pVersion; self.request = rNumber; self.dataVersion = dvReturned; //do some if statment stuff here to put the cache in the right place or what have you. if (methodName == @"manufacturers") { self.man = cValue; } else if (methodName == @"models") { self.mod = cValue; } else if (methodName == @"subMod") { self.sub = cValue; } self.cacheValue = [NSDictionary dictionaryWithObjectsAndKeys: man, @"Manufacturers", mod, @"Models", sub, @"SubModels", nil]; NSDictionary *plistDict = [NSDictionary dictionaryWithObjectsAndKeys: signature, @"Signature", version, @"Version", request, @"Request", dataVersion, @"Data Version", cacheValue, @"Cache Value", nil]; NSString *error = nil; // create NSData from dictionary NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; // check is plistData exists if(plistData) { // write plistData to our Data.plist file [plistData writeToFile:plistPath atomically:YES]; NSString *myString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding]; // NSLog(@"%@", myString); } else { NSLog(@"Error in saveData: %@", error); // [error release]; } } @end 

你不能写一个.plistNSUserDefaults ,至less不能。 为了达到这个目的,你必须将.plist特定键写入NSUserDefaults ,这基本上就是保存所有数据的两个副本。 您可以将NSUserDefaults视为您可以读取和写入的不可见.plist ,而无法真正看到文件。 使用NSUserDefaults ,你将能够恢复保存的值,即使应用程序已被杀死在多任务。

但是,如何在.plistNSUserDefaults之间进行select应该NSUserDefaults需要保存多less数据。 苹果build议只保存less量的数据到NSUserDefaults 。 如果你需要保存大量的信息,那么.plist就是要走的路。 无论是或者当然Core-Data

.plist是一个键值对文件。 这本质上是一本字典。 当你在.plist中存储数据时,你正在坚持它。 即使你的应用程序被杀死,你也可以重新获得它。

NSUserDefaults也一样。 这是更清洁,更快。 所以任何一种方法都已经足够了