0

Xcode는 아래 코드에서 볼 수 있듯이 "이 블록에서 'self'를 강력하게 캡처하면 유지주기가 발생할 수 있습니다. '라는 경고 만 표시하는 경우가 있습니다.xcode 유지주기 경고가 때때로 발생합니다

enter image description here

첫 번째 블록은 유지주기에서 실제로 안전한가요, 만약 그렇다면 왜하거나 안전하지 않은이며, 엑스 코드는 잘못 경고를 제공하지 않습니다?

답변

1

두 블록 모두 유지주기가 발생합니다. 컴파일러가 첫 번째 코드를 감지하지 못하기 때문에 컴파일러가이를보고하지 않습니다.

첫 번째 블록에서는 datePicker이 개체의 속성이라고 가정합니다. 따라서 개체에는 날짜 선택 도구가 있습니다. 날짜 선택 도구는 개체를 유지하는 블록을 유지합니다 (자기를 캡처하여). 그럼에도 불구하고 3 개의 객체가 있지만 하나의 사이클이있는 사이클입니다.

두 번째 블록에서는 훨씬 간단합니다. 개체가 블록을 유지하고 블록이 개체를 유지합니다 (자기를 캡처하여). 식별하기 쉬운 개체가 2 개만있는주기입니다 (따라서 경고).

두 경우 모두 유지주기를 피하려면 약하게 캡처해야합니다.

__weak typeof(self) weakSelf = self; 
[self methodThatRetainsABlock: ^{ 
    typeof(weakSelf) strongSelf = weakSelf; 
    if (strongSelf == nil) { 
     return; 
    } 
    // Don't ever use self here, as it will capture it strongly. 
    // Use only strongSelf 
}]; 
+0

감사합니다. 'datePicker'는 속성입니다. 그렇다면 안전하지 않겠습니까? – AndyW

+0

반드시 그렇지는 않습니다. View Controller -> Main View -> Date Picker (서브 뷰) -> Block -> View Controller를 가질 수 있습니다. 어떤 것도 루프를 형성 할 수 있습니다. 실제로 오브젝트 그래프를 염두에 두어야하며 그런 일이 발생하지 않도록해야합니다. – deadbeef

+0

뷰 컨트롤러는'view' 속성을 통해 메인 뷰를 유지합니다. 뷰는 하위 뷰를 유지합니다. – deadbeef

1

OnDateChange가 다른 개체로 전송되므로 Xcode에서 이론적으로는 여전히 발생할 수 있지만 유지주기가 없기를 기대합니다.

AddOnTap이 자체로 전송되므로 블록을 유지하는 가능성이 높습니다. 그러므로 경고.

+0

예를 들어 나는 스크린 샷의 우연한 일치입니다. 나는 자기 방법이 자기를 부르는 블록을 붙잡을 때, 그리고 그 반대의 경우 경고를주지 않는 것을 보았다. – AndyW

관련 문제