У меня есть массив, который я сохраняю в 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;
}
Если у вас есть определенные свойства, вы можете сохранить его неявно, используя self. <Имя_файла>, то есть self.title = [coder decodeObjectForKey: @ "title"]; –
Это означает КАЖДЫЙ ОБЪЕКТ, по-видимому, включая объекты внутри методов initWithCoder:. Таким образом, если unarchiver segfaulting при выпуске, пройдите и убедитесь, что ваши объекты внутри объектов и объекты внутри этих объектов, а также объекты внутри этих объектов и т. Д. Сохраняются при распаковке. – Tustin2121
@Ben Jakuben: Большое спасибо, что работает для меня. – Vjlakshmi