2009-12-11 2 views
0

У меня есть массив, который я сохраняю в NSUserDefaults, содержащий массив моего пользовательского класса Assignment, который соответствует протоколу NSCoding. Массив сохраняет и загружает правильно, и я могу проверить, что полученный первый объект массива принадлежит классу Assignment. Проблема возникает, когда я пытаюсь получить доступ к ivars объекта Assignment в массиве. Он выходит из строя, и я получаю следующую ошибку:Объекты NSKeyedUnarchiver нарушаются?

*** -[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, в котором произошел сбой. У кого-нибудь есть идеи?

EDIT: Вот мои методы 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; 
} 

ответ

3

ответил на мой собственный вопрос. В initWithCoder, мне нужно, чтобы сохранить все объекты, я декодирование:

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

Все прекрасно работает в настоящее время. :)

+1

Если у вас есть определенные свойства, вы можете сохранить его неявно, используя self. <Имя_файла>, то есть self.title = [coder decodeObjectForKey: @ "title"]; –

+1

Это означает КАЖДЫЙ ОБЪЕКТ, по-видимому, включая объекты внутри методов initWithCoder:. Таким образом, если unarchiver segfaulting при выпуске, пройдите и убедитесь, что ваши объекты внутри объектов и объекты внутри этих объектов, а также объекты внутри этих объектов и т. Д. Сохраняются при распаковке. – Tustin2121

+0

@Ben Jakuben: Большое спасибо, что работает для меня. – Vjlakshmi

 Смежные вопросы

  • Нет связанных вопросов^_^