2014-05-19 3 views
1

AF 네트워킹 코드에는 개체를 분명히 변경할 필요가없는 메서드에서 개체에 __block을 사용하는 몇 가지 위치가 있습니다. 예를 들어, AFHTTPSessionManager에서 GET 호출은 작업 객체에 __block을 사용합니다. 왜 그런가?AFNetworking에서 일부 반환 객체가 __block 유형으로 선언되는 이유는 무엇입니까?

마찬가지로 다른 클래스에서는 자격 증명 개체에 대해 아래와 같이 개체에 __block이 사용됩니다.

- (void)URLSession:(NSURLSession *)session 
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler 
{ 
    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; 
    __block NSURLCredential *credential = nil; 

    if (self.sessionDidReceiveAuthenticationChallenge) { 
     disposition = self.sessionDidReceiveAuthenticationChallenge(session, challenge, &credential); 
    } else { 
     if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
      if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust]) { 
       credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; 
       if (credential) { 
        disposition = NSURLSessionAuthChallengeUseCredential; 
       } else { 
        disposition = NSURLSessionAuthChallengePerformDefaultHandling; 
       } 
      } else { 
       disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; 
      } 
     } else { 
      disposition = NSURLSessionAuthChallengePerformDefaultHandling; 
     } 
    } 

    if (completionHandler) { 
     completionHandler(disposition, credential); 
    } 
} 
+1

내게 실수 인 것처럼 보입니다. 적어도 첫 번째는 않습니다. – CodaFi

답변

1

이 두 장소에서 __block은 쓸모없고 필요하지 않습니다.

첫 번째 경우 변수 task은 정의 된 행의 초기화 이후에 지정되지 않습니다. __block은 변수가 할당 된 경우에만 유용하며 (MRC에서 비 보유 목적으로 사용됨) 여기서는 무의미합니다.

두 번째 경우 변수 credential은 블록에 전혀 캡처되지 않으므로 다시 쓸모가 없습니다.