我有,我已经制作成单和我能够挽救它使用的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返回?它不能真正地点的另一个实例,它不是在任何保存的值的加载。在我它转换为一个单保存和加载是正常工作。

有帮助吗?

解决方案

在此处,我觉得这是怎么了。你熟悉NSCoding和通常由通过encodeWithCoder使你的对象可编码采用它:和的initWithCoder:覆盖。什么让这一切更简单的是,你仍然可以使用NSCoding,并没有覆盖这些方法NSCoders。你可以编码共享对象的状态,而不编码该共享obejct本身。这防止了共享对象进行解码的棘手的问题。

下面是什么,我想你可以做一个例子:

@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

下面,我们有一个共享对象,并且它使用带键档案坚持配置,但我们不共享对象本身进行编码。这避免解码单例类的第二实例的那棘手的问题。

其他提示

您需要做的加载本身正在发生的事情在这里是您创建单一的单,你分配一个lval中的单,然后创建一个新的对象,并重新分配lval中给新的对象,而无需修改单。换句话说:

//Set venue to point to singleton
Venue *venue = [Venue sharedVenue];

//Set venue2 to point to singleton
Venue *venue2 = [Venue sharedVenue];

NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

//Set venue to unarchived object (does not change the singleton or venue2)
venue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];

您想要做的是在sharedVenue处理这个。有一对夫妇的方式做的人单身,所以我不能确定你在做什么,但是让我们假设sharedVenue目前看起来是这样的:

static Venue *gSharedVenue = nil;

- (Venue *) sharedVenue {
  if (!gSharedVenue) {
    gSharedVenue = [[Venue alloc] init];
  }

  return gSharedVenue;
}

假设是这样的话,你想改变它的对象加载到全球背衬的单例:

static Venue *gSharedVenue = nil;

- (Venue *) sharedVenue {
  if (!gSharedVenue) {
    NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [data release];

    gSharedVenue = [unarchiver decodeObjectForKey:@"Venue"];
    [unarchiver finishDecoding];
    [unarchiver release];
  }

  if (!gSharedVenue) {
    gSharedVenue = [[Venue alloc] init];
  }

  return gSharedVenue;
}

显然,你需要以某种方式传达给归档目标文件的实际路径。

EDIT基于COMMENT:

好吧,如果你使用,你需要在类init方法来对付这种基于页头单:

- (id) init {
  self = [super init];

  if (self) {
    NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [data release];

    Venue *storedVenue = [unarchiver decodeObjectForKey:@"Venue"];
    [unarchiver finishDecoding];
    [unarchiver release];

    if (storeVenue) {
       [self release];
       self = [storedVenue retain];
    }

  }

  return self;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top