Objective c NSKEYEDUNACHIVER对象损坏了吗?

Objective c NSKEYEDUNACHIVER对象损坏了吗?,objective-c,nskeyedarchiver,Objective C,Nskeyedarchiver,我有一个保存到NSUserDefaults的数组,其中包含一个自定义类赋值的数组,它符合NSCoding协议。数组正确保存和加载,我可以验证检索到的数组的第一个对象是否属于类赋值。当我试图访问数组中赋值对象的IVAR时,就会出现问题。它崩溃了,我得到了以下错误: *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x3948d60 下面是我用来保存为用户默认值的代码。请注意,我还在检索和检查保存的

我有一个保存到NSUserDefaults的数组,其中包含一个自定义类赋值的数组,它符合NSCoding协议。数组正确保存和加载,我可以验证检索到的数组的第一个对象是否属于类赋值。当我试图访问数组中赋值对象的IVAR时,就会出现问题。它崩溃了,我得到了以下错误:

*** -[CFString respondsToSelector:]: message sent to deallocated instance 0x3948d60
下面是我用来保存为用户默认值的代码。请注意,我还在检索和检查保存的对象以进行调试

 -(void)saveToUserDefaults:(NSArray*)myArray
{
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

    if (standardUserDefaults) {
        [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"];
        [standardUserDefaults synchronize];
    }
    NSLog(@"Assignments array saved. (%d assignments in array)",[myArray count]);
    NSData *dataCheck = [[NSData alloc] initWithData:[standardUserDefaults objectForKey:@"Assignments"]];
    NSArray *arrayCheck = [[NSArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataCheck]];
    NSLog(@"Checking saved array (%d assignments in array)",[arrayCheck count]);
    if ([[arrayCheck objectAtIndex:0] isKindOfClass:[Assignment class]]) {
        NSLog(@"It's of the class Assignment.");
    }
    Assignment *testAssignment = [[Assignment alloc] initWithAssignment:[arrayCheck objectAtIndex:0]];
    NSLog(@"Title: %@ Course: %@",[testAssignment title],[testAssignment course]);
}
在我分配testAssignment(崩溃发生的地方)之前,一切都很好。有人有什么想法吗

编辑:以下是我在作业类中的NSCoding方法:

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:title forKey:@"title"];
    [coder encodeObject:course forKey:@"course"];
    [coder encodeObject:dueDate forKey:@"dueDate"];
    [coder encodeObject:notes forKey:@"notes"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [[Assignment alloc] init];
    if (self != nil)
    {
        title = [coder decodeObjectForKey:@"title"];
        course = [coder decodeObjectForKey:@"course"];
        dueDate = [coder decodeObjectForKey:@"dueDate"];
        notes = [coder decodeObjectForKey:@"notes"];
    }   
    return self;
}

回答了我自己的问题。在initWithCoder中,我需要保留我正在解码的所有对象:

//Example    
title = [[coder decodeObjectForKey:@"title"] retain];

现在一切都运转得很好。:)

回答了我自己的问题。在initWithCoder中,我需要保留我正在解码的所有对象:

//Example    
title = [[coder decodeObjectForKey:@"title"] retain];

现在一切都运转得很好。:)

或者,如果已定义属性,则可以使用self隐式保留它,即self.title=[coder decodeObjectForKey:@“title”];这意味着每个对象,显然包括initWithCoder:methods中的对象。因此,如果未归档程序在发布时正在进行分段,请检查并确保对象中的对象、这些对象中的对象以及这些对象中的对象等在未归档时都被保留。或者,如果已定义属性,则可以使用self隐式保留它,即self.title=[coder decodeObjectForKey:@“title”];这意味着每个对象,显然包括initWithCoder:methods中的对象。因此,如果在发布时未归档,请检查并确保对象中的对象、这些对象中的对象以及这些对象中的对象等在未归档时都被保留。