2011-08-26 2 views
9

일부 최근의 (관련없는 것으로 보이는) 변경 사항이 적용될 때까지 제대로 작동하는 일부 핵심 데이터 기능이 있습니다. 이제 특정 NSManagedObject 하위 클래스 인스턴스에 속한 모든 특성이 갑자기 nil을 반환하는 문제가 발생합니다.코어 데이터 속성이 nil (ARC 관련)으로 변경됩니다.

내 NSManagedObject 하위 클래스가 Foo이고 value라는 속성이 하나만 있다고 가정 해 보겠습니다. 가치가 어떻게 든 제로가되었다는 것을 깨닫게되면 다음 범주를 설정하여 가치 변화를 모니터링하십시오.

@implementation Foo (Debug) 

- (void)setValue:(NSDate *)value 
{ 
    [self willChangeValueForKey:@"value"]; 
    [self setPrimitiveValue:value forKey:@"value"];  
    [self didChangeValueForKey:@"value"]; 
} 

- (NSDate *)value 
{ 
    [self willAccessValueForKey:@"value"]; 
    NSDate *value = [self primitiveValueForKey:@"value"]; 
    [self didAccessValueForKey:@"value"]; 

    return value; 
} 

@end 

setValue : 내 개체에 대해 호출되며 전달 된 인수는 NSDate가 아닌 숫자입니다. 그런 다음 값이 검색됩니다 (다른 메소드에서). 지정된 동일한 값이 올 Y 르게 검색됩니다.

그러나 다른 메서드가 값을 읽으려고하면 값 접근자가 호출되고 primitiveValueForKey :에 의해 nil 값이 반환됩니다.

두 개의 읽기 사이에 setValue :가 호출되지 않고 Foo 객체 자체가 유효합니다 (nil이 아님). 사실, 다른 Core Data 연산은 모든 Core Data 객체 또는 전체 컨텍스트에 대한 두 가지 읽기간에 수행되지 않습니다.

우리 프로젝트에서 ARC를 사용하고 있습니다. ARC가 내 Core Data 변수를 어지럽히고 할당 해제 할 수 있습니까? 그렇다면 누구나 ARC 할당 해제 디버깅에 대한 제안이 있습니까? 또는 ARC가 내 변수를 할당 해제하지 못하도록하는 방법을 아는 사람이 있는지 여부가 더 좋습니다.

이것은 ARC와 관련이 없을 수도 있습니다. 그러나 무슨 일이 벌어지고 있는지에 관해서는 약간의 상실감이 있습니다. 어떤 제안이라도 대단히 감사 할 것입니다.

+0

ARC는 아직 NDA하에 있으므로 Apple의 제한 포럼 외부에서 논의 할 수 없습니다. – TechZen

+8

[ARC는 NDA에 속하지 않습니다.] (http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-June/015588.html) –

+0

두 개의 서로 다른 두 개의 스레드에서 작업 할 가능성이 있습니다 그 대상의 사본들? 그렇지 않으면이 객체와 정확히 일치합니까? 두 개 만들지 않았다고? 또는 컨텍스트를 재설정하지 않았거나 변경 사항을 잃어 버리지 않았습니까? –

답변

11

작동합니다. NSManagedObject 인스턴스가 있지만 주변 상황을 고수하지 않으면 해당 관리 객체가 nil으로 반환되기 시작합니다.

ARC에서 strong 변수 (즉, weak 또는 static 글로벌이 아닌 인스턴스 변수)에 컨텍스트를 저장해야합니다.

ARC가 아닌 (즉, 공개 유출 코드) 컨텍스트를 유지해야합니다.

+0

왜 이런 일이 발생하는지 아는 사람이 있습니까? 나는 같은 문제가 있었고 내 자신의 managedObjectContext 변수를 사용해서 만 해결할 수있었습니다. 그러나 이것은 성가시다. 버그처럼 들린다. – lindinax

+0

** 당신은 ** 상황을 고수해야합니다. 그건 버그가 아니야. 관리 대상 객체 컨텍스트는 대부분의 핵심 데이터를 작동시킵니다. 컨텍스트가없는 경우 관리 대상 개체는 상호 작용할 대상을 알 수 없습니다. –

+0

ivar'NSManagedObjectContext * mContext'를 사용하면 작업이 수행되지 않습니까? – lindinax

0

확인 viewDidLoad에-방법

profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext]; 

희망이 이러한 개체가 속해있는 NSManagedObjectContext이 떨어져 가고 있기 때문에 이것은 매우 가능성이