2016-06-15 4 views
1

는 현재, 내가, 신속한

CoreDataStack.sharedIntance.backgroundContext.performBlock({ 
    let fetchRequest    = NSFetchRequest(entityName: "Schedule") 
    let sortDescriptor    = NSSortDescriptor(key: "startTime", ascending: true) 

    fetchRequest.sortDescriptors = [sortDescriptor] 
    var result = [Schedule]() 

    mainContext.performBlockAndWait { [unowned self] in 
     do { 
      result = try mainContext.executeFetchRequest(fetchRequest) as! [Schedule] 
      success?(result) 
     } catch { 
      print("error is \(error)") 
     } 
    } 
}) 

를 수행하여 핵심 데이터를 가져 오는 일을하고 내가 오류를 재산

참조 무엇입니까 폐쇄에 mainContext 내가 솔루션의 일부 그들이을 추가하는 것을 알 수

명시 적 메이크업 캡처 의미에 명시 적으로 자기를 필요로블록의 속성입니다.

보유주기를 피하기 위해 weak or unowned을 작성하는 것이 좋습니까? 그리고이 상황을 처리하는 가장 좋은 방법은 무엇입니까?

+0

먼저 Swift 3의 핵심 데이터가 크게 변경되었습니다. 프로덕션 코드를 작성하지 않은 경우이를 사용하여 학습하는 것이 좋습니다. 둘째, 자기에 대한 언급은 '자기'를 요구한다. 모든 폐쇄에서. – jjatie

+0

고맙습니다. 그러나 자아 사용에 대한 자세한 내용을 알려주시고 누출 메모리를 유발합니까? – tonytran

+0

'self'란 무엇입니까 (예 :'self.mainContext')? View Controller와 같은 UIKit 객체입니까? – CouchDeveloper

답변

3

블록에서 self을 사용할 때마다 해당 블록의 미래를 고려해야합니다. 그렇지 않으면 참조주기를 생성하고 메모리가 누출 될 수 있습니다 (스위프트가 명시해야하는 이유입니다). 참조주기는 블록이 self을 캡처하고 (다른 개체가 해당 블록을 점유하고 self이 다른 개체를 점유 할 때) 자주 발생합니다. 이 구성에서는 self과 다른 개체가 모두 포함 된주기가 있으므로 어느 것도 할당을 취소 할 수 없습니다.

블록이 "X가 발생할 때마다 처리기"일 때 가장 자주 발생합니다. 해당 블록을 보유하고 알림을받는 개체는 알림을 받으려는 것으로 소유되는 경우가 많습니다. 이것은 아마도 가장 일반적인 종류의 참조 루프 일 것입니다. 일반적으로 self을 약하게 만들어 해결합니다.

performBlock 그러나 이러한 종류의 기능은 아닙니다. 블록을 실행 한 다음 해제합니다. Swift 용어로는 @noescape입니다 (그리고 앞으로는 그 방법으로 표시 될 수 있으므로 noescape 클로저에서는 self.을 사용할 필요가 없습니다). 블록이 실행될 때까지 self은 할당 해제 될 수 없지만 블록이 실행 된 후주기는 즉시 중단됩니다. 아마 당신이 원했던 것입니다. 따라서 여기서 self.을 사용하면 문제가 없으며 약한 참조의 복잡성을 추가 할 이유가 없습니다.