gpt4 book ai didi

ios - 为什么 `NSUserDefaults` 不允许存储自定义类的对象?

转载 作者:可可西里 更新时间:2023-11-01 00:59:12 24 4
gpt4 key购买 nike

我已经看到 NSUserDefaults 不允许除 ArrayDictionaryStringNSDataNSNumberBoolNSDate。但是

  • 为什么不允许存储其他对象?
  • 如果我需要将一些属性存储为单个对象怎么办?如果我用字典来做,我必须把键写在我用来存储值的地方。那么,还有什么其他选择。
  • 如果 Apple 允许其他对象也存储,将会出现什么问题。
  • 如果我们使用 CoreData 而不是 NSUserDefaults 会怎么样。我知道 NSUserDefaults 是全局可用的。
  • 如果应用被终止,即使在我们重新启动应用后,要在全局范围内提供值(value)的最佳方式是什么?

正如@Hoa 所建议的,之前我也忘了提及 NSCoding 选项

  • 如果我们在自定义类中有很多属性,我们是否需要使用 NSCoding 方法对所有属性进行编码和解码?

最佳答案

只要符合 NSCoding 协议(protocol),您就可以将任何对象保存到 plist 文件中。

您可以使用类似这样的代码:

+(id) readObjectFromFile:(NSString*) sFileName
{
return [NSKeyedUnarchiver unarchiveObjectWithFile:sFileName];
}


+(bool) saveObject:(id <NSCoding>) anObject ToFile:(NSString*) sFileName
{
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:anObject];
NSError * error;
[data writeToFile:sFileName options:NSDataWritingAtomic error:&error];
if (error)
{
NSLog(@"Save Cats Data error: %@", error.description);
return NO;
}
return YES;
}

快速版本:

func readObjectFromFile(sFileName: String) -> AnyObject {
return NSKeyedUnarchiver.unarchiveObjectWithFile(sFileName)
}

func saveObject(anObject: AnyObject, ToFile sFileName: String) -> Bool {
var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(anObject)
var error: NSError
data.writeToFile(sFileName, options: NSDataWritingAtomic, error: error)
if error != nil {
print("Save Cats Data error: \(error.description)")
return false
}
return true
}

要了解有关 NSCoding 协议(protocol)的更多信息,您可以阅读: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/

关于ios - 为什么 `NSUserDefaults` 不允许存储自定义类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com