문제

NSSUREDEFAULTS에 저장하는 배열이 있습니다. 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];

이제 모든 것이 아름답게 작동합니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top