7

SO (및 Apple docs)의 another question에서 지적한 것처럼 NSManagedObject 인스턴스에는 해당 인스턴스의 출처가 된 NSManagedObjectContext에 대한 강력한 참조가 없습니다. 첫 번째 홍당무에서는 이상한 결정 인 것 같습니다. 인스턴스가 context 없이는 거의 쓸모가 없기 때문에 faults not firing when they should과 같은 혼란스러운 버그가 발생합니다.왜 NSManagedObject 인스턴스는 NSManagedObjectContext에 대한 강력한 참조를 보유하지 않습니까?

왜 이런 경우에 대한 배경 지식을 제공 할 수 있습니까? 자동으로 NSManagedObjectContext에 대한 강력한 참조를 보유하는 NSManagedObject 하위 클래스를 구현하는 것은 위험할까요?

편집 :이 질문에 좋은 답변을 덕분에, 내 관리되는 개체가 RestKit에 의해 의도적으로 일시 NSManagedObjectContext에 대해 생성 된 것을 발견했습니다. 이것은 내 다음 질문으로, RestKit, here에만 해당됩니다.

답변

4

NSManagedObjectContextNSManagedObject을 소유하고있는 것이 더 좋습니다.

컨텍스트는 모든 개체가있는 그리기 패드와 같습니다. 해당 컨텍스트가 사라지면 해당 개체는 더 이상 유효하지 않습니다. 객체가 컨텍스트를 소유 한 경우 컨텍스트가 사라지는 것은 객체에 아무런 영향을 미치지 않으며 여전히 유효한 것처럼 보입니다. 즉, 컨텍스트는 객체없이 존재할 수 있고, 객체는 컨텍스트없이 존재할 수 없습니다.

물론 하이브리드 모델 (컨텍스트가 개체와 개체의 컨텍스트를 소유하고있는 경우)은 유지 사이클로 실행되기 때문에 작동하지 않습니다.

NSManagedObject 인스턴스와 반드시는 아니지만 자신의 상황에 맞는

그들은 할 수없이 거의 쓸모가 있지만, 자신의 상황에 대한 참조를해야 할 것을 기억! 아마도 그것은 약한 참조이지만 그럼에도 불구하고 참조입니다. 해당 참조가 nil을 반환하면 개체가 유효하지 않습니다.. 귀하의 상황이 주변에 머물러 있는지 확인하면 (이는 다른 질문에 대한 내 답변에서 한 것입니다), 아무런 문제가 없습니다.

3

그렇지 않으면 주기가이 될 것이기 때문입니다. 관리 객체 컨텍스트는 내부적으로 관리 객체에 대한 참조가있는 배열 및 기타 컨테이너를 사용합니다.

아마도이 유지주기를 코어 데이터의 내부 구현으로 쉽게 "명백하게"깨뜨릴 수 없으므로이 참조가 약할 수 있습니다.

+0

CouchDeveloper가 정확하며 관리되는 객체 클래스의 컨텍스트에 대한 강력한 참조를 추가하는 것이 잠재적으로 위험 할 수 있습니다. "해야"할 때 발생할 수있는 결함은 여러 가지로 인해 발생할 수 있지만 가장 자주 접근기 메서드를 잘못 구현 한 것입니다. – quellish