2017-12-28 15 views
1

은 내가 자식 컨텍스트를 사용하는 방법을 학습 때 :왜 관리 대상과 컨텍스트간에 약한 참조가 있습니까?

let childContext = 
NSManagedObjectContext(
concurrencyType: .mainQueueConcurrencyType) 
childContext.parent = coreDataStack.mainContext 

let childEntry = 
childContext.object(with: surfJournalEntry.objectID) 
as? JournalEntry 
// 3 
detailViewController.journalEntry = childEntry 
detailViewController.context = childContext 
detailViewController.delegate = self 

저자는 관리 객체와 detailViewController에 관리되는 개체 컨텍스트를 모두 통과에 대한 몇 가지 발언을했다 :

참고 : 당신은 왜 궁금 할 것이다 관리 대상 객체에 컨텍스트 변수가 이미 있으므로 관리 된 객체와 관리 객체 컨텍스트를 모두 detailViewController 인 에 전달해야합니다. 이는 관리 대상의 컨텍스트에 대한 약한 참조 만 있기 때문입니다. 컨텍스트를 전달하지 않으면 ARC가 메모리에서 컨텍스트를 제거합니다 ( 이후로 다른 컨텍스트가 유지되지 않으므로). 이 예상대로 동작하지 않습니다.

음, 좋아, 그래서 다음 몇 가지 공식 문서 읽기 :

이 일반적으로 관리되는 객체 인스턴스의 수명을 보장하기 위해 문맥에 의존 할 수 없다, 당신이 의지 할 수 없음을 의미를 컨텍스트의 수명을 보장하기 위해 관리되는 객체가 존재 함을 나타냅니다. 다른 방법으로 말하자면, 객체를 가져 왔다고해서 그것이 이라는 것을 의미하지는 않습니다.

그러나 아직 관리 대상과 컨텍스트 사이의 약한 참조를 만드는 것이 진정한 의도인지 알 수 없습니까? 그들이 추구하는 목표는 무엇입니까?

+1

"공식 문서"란 무엇입니까? 이 견적을 문맥에서 읽을 수 있다면 도움이 될 것입니다. –

답변

1

관리되는 개체 컨텍스트 일반적으로은 과도한 메모리 사용 가능성을 피하기 위해 가져온 개체에 약한 참조를 사용합니다. 강력한 참조를 사용하고 다수의 결과를 찾은 하나 이상의 가져 오기를 수행 한 경우 모두 해당 컨텍스트가 존재하는 한 메모리에 남아 있습니다. 앱이 종료 될 때까지 컨텍스트가 존재하기 때문에 결코 사라지지 않을 것이라는 것을 의미하는 많은 앱에서. 이로 인해 앱에서 더 이상 사용하지 않는 개체에 많은 메모리를 사용하게 될 수 있습니다. 약한 참조는 앱이 앱 사용을 중지하자마자 관리 대상 개체의 할당이 취소됨을 의미합니다.

하지만 강력한 참조가 필요한 경우가 있으므로 retainsRegisteredObjects이라는 부울 속성을 사용하면 대신에 강력한 참조를 사용하게됩니다. 원한다면 사용하십시오. 그러나 메모리 사용에주의하십시오.

관리되는 개체는 참조주기를 피하기 위해 해당 컨텍스트에 대한 강력한 참조를 유지하지 않습니다. 그들이 강력한 참조 였고 retainsRegisteredObjectstrue으로 설정하면 참조주기가 생깁니다. 각 객체는 다른 객체에 대한 강력한 참조를 보유하므로 참조 중 하나를 nil로 설정하지 않으면 메모리에서 객체를 릴리즈 할 수 없습니다.

0

managedObject는 작고 어리석은 개체라고 생각할 수 있습니다. 그들은 그들의 문맥을 가리키는 포인터를 가지고 있고 그들의 objectId를 알고있다. 그들이 뭔가를 알 필요가있을 때 문맥을 문의하십시오. 이것은 많은 장점을 가지고 있습니다. 엔터티가 이미 컨텍스트에서 쿼리를 수행 한 경우 두 번째 인스턴스가 컨텍스트의 행 캐시에 도달하고 저장소에 전혀 도달하지 않습니다.

일반적으로 항상 두 가지 종류의 컨텍스트 (대부분의 핵심 데이터 설정)가 있습니다. 항상 메모리에있는 긴 수명의 주 큐 컨텍스트와 짧은 수명의 백그라운드 컨텍스트가 있습니다. 주 대기열 상황에서는 일반적으로 메모리를 떠나는 컨텍스트에 대해 걱정할 필요가 없습니다. 그들은 일반적으로 응용 프로그램의 수명 동안 메모리에 머물러 있습니다. 수명이 짧은 상황은 메모리를 남겨 두는 문제가 있으며 스레드로부터 안전하지 않은 문제도 있습니다. 따라서 일반적으로 올바른 스레드에있는 블록에 사용되어야합니다. 사용 된 후 폐기되고 블록 밖으로 전달되지 않습니다.

나는 그것을 설명하기를 바랍니다.