0

서버 연결을 만들기 위해 샘플 코드를 작성했습니다. 아래에 작성한 코드를 찾으십시오.약한 자기가 블록 내부에서 아무 것도 얻지는 않지만 블록 내에서 자체 객체를 사용하려고합니다.

__weak typeof(self) weakSelf = self; 
self.dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
{ 
    weakSelf.dataTask = nil; 
    NSInteger extractionResponseCode = [((NSHTTPURLResponse *)response) statusCode]; 
    if (!error && data.length > 0 && extractionResponseCode == 200) 
    { 
     [weakSelf handleResponse:data]; 
    } 
    else 
    { 
     [weakSelf handleError:error]; 
    } 
}]; 

나도 handleResponse: 또는 handleError: 응답을 기반으로 전화를해야 응답을받은 후.

나는 ARC에서주기 유지 문제를 피하기 위해 weak을 취했습니다.

여기 내 문제는 weakSelf가 021이 아니므로 handleResponse:이나 handleError: 메서드가 호출되지 않습니다.

이 문제를 어떻게 해결할 수 있습니까?

미리 감사드립니다.

답변

2

대답은 강력한 참조를 포착하는 것입니다. 어쨌든 self에 완료 블록에 대한 참조가없는 한 보유주기가 없습니다. 블록 참조가 반환되면 강력한 참조가 해제되어 주기적으로 중단됩니다.

0

데이터를 다운로드하면 개체가 살아서는 안된다는 아이디어가 있습니다. 다운로드가 실행 중일 때 객체가 사라지는 경우 (예를 들어 사용자가 화면을 전환하여 다른 화면으로 전환 한 경우) 결과를 무시하고 버리거나 파일에 저장해야합니다. 자아가 무효가되게하십시오.

이것은 참조주기와 관련이 없습니다. 자기 은 결국 weakSelf를 사용하지 않으면 사라지지만 필요 이상으로 오래 살아 있어야합니다. 최악의 경우, 오래 전에 사라진 화면에 대한 오류 경고를 사용자에게 표시 할 수 있습니다. 실패한 URL 요청이 실패하는 데 60 초가 걸릴 수 있으므로 사용자가 이미 완전히 다른 작업을 수행 할 수 있습니다.

weakSelf를 사용하는 올바른 방법은 콜백의 새 변수 strongSelf에 할당 한 다음 nil이 아닌지 확인하는 것입니다. 직접 weakSelf를 사용하는 것은 언제든지 무효가 될 수 있기 때문에 나쁘다.

0

나는 사람들이 왜 당신이 그것을 잡을 때마다 자신을 약화시킬 필요가 있다고 생각하는지 궁금합니다.

주기가 이고주기가 인 경우 첫 번째 참조를 보유한 객체를 참조하는 객체에 대한 참조가있는 경우 (직접 또는 다른 참조 번호를 통해) 하나만 가질 수 있습니다.

따라서 블록 컨텍스트가 self을 가리키는 경우 블록이 self에 의해 참조되는 경우에만 참조주기가 있습니다. (BTW : 이것은 모든 (강력한) 참조에 적용됩니다. Objective-C에는 self에 대한 특별한 내용이 없습니다.) 당신은 필요 없습니다. 보관주기를 방지하면 귀하의 경우에는 self을 약화시킬 이유가 없습니다.

그러나 어떤 사람들은 그것을 약화시키고 그러한 경우에 selfnil을 만듭니다. 이것은 의도입니다. 이는 상황에 따라 이점이 될 수 있습니다. 데이터를 다운로드하는 동안 사라진 모델 객체를 생각하면됩니다. 살아있을 이유가 없습니다.

원하지 않는 경우 단순히 self을 약화시키지 마십시오.그것은 은 간단합니다입니다.