iphone - 从 NSKeyedArchiver 加载单例状态

标签 iphone objective-c cocoa-touch singleton nskeyedarchiver

我有一个类,我已经把它变成了一个单例,并且能够使用 NSKeyedArchiver 保存它的状态,但是我无法全神贯注地把它的状态拉回来。

在执行加载的函数中

Venue *venue = [Venue sharedVenue];
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
venue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];

使用这段代码,decodeObjectForKey 返回什么?它不可能真的是 Venue 的另一个实例,并且它没有加载任何已保存的值。在我将其转换为单例之前,保存和加载工作正常。

最佳答案

这是我认为出错的地方。您熟悉 NSCoding 并且通常通过 encodeWithCoder: 和 initWithCoder: 覆盖使您的对象可编码来采用它。让这一切变得更简单的是,您仍然可以使用 NSCoding 和 NSCoders,而无需覆盖这些方法。您可以对共享对象的状态进行编码,而无需对共享对象本身进行编码。这避免了解码共享对象的尴尬问题。

以下是我认为您可以执行的操作的示例:

@implementation MySharedObject
+ (id)sharedInstance {
    static id sharedInstance = nil;
    if (!sharedInstance) {
        sharedInstance = [[MyClass alloc] init];
    }
}

- (id)init {
    if ((self = [super init])) {
        NSData *data = /* probably from user defaults */
        if (data) { // Might not have any initial state.
            NSKeyedUnarchiver *coder = [[[NSKeyedUnarchiver alloc] initForReadingWithData:data] autorelease];
            myBoolean = [coder decodeBoolForKey:@"MyBoolean"];
            myObject = [[coder decodeObjectForKey:@"MyObject"] retain];
            [coder finishDecoding];
        }
    }
    return self;
}

- (void)saveState {
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *coder = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
    [coder encodeBool:myBoolean forKey:@"MyBoolean"];
    [coder encodeObject:myObject forKey:@"MyObject"];
    [coder finishEncoding]
    // Save the data somewhere, probably user defaults...   
}
@end

这里我们有一个共享对象,它使用键控存档来持久化配置,但我们不对共享对象本身进行编码。这避免了解码单例类的第二个实例的尴尬问题。

关于iphone - 从 NSKeyedArchiver 加载单例状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1148853/

相关文章:

ios - 如何更改用于创建按钮/标签的默认字体?

ios - 将触摸转发到 UIScrollView

iphone - 我需要维护两个sdk(3.0和4.0)。但在 3.0 sdk 中我收到错误

iphone - 在 Viewfor headerinsection 中单击 UITableView 部分

iphone - NSURLConnection 分块编码上传 - 如何?

objective-c - 自定义表格单元格 iOS 6

iphone - 在这种情况下,如何创建自动发布的NSDictionary?

iphone - 用Cocos2D制作动画有什么好方法吗?

iphone - 如何在不调用选择器的情况下分离线程,或者至少进行变通?

objective-c - 导入 <AppKit/AppKit.h> 不起作用