3

:중첩 된 블록으로 자체 유지? 다음 코드

@interface MyClass() 
{ 
    NSMutableArray * dataArray; 
} 
@end 

@implementation MyClass 

- (void) doSomething 
{ 
    __typeof__(self) __weak wself = self; 
    dispatch_async(dispatch_get_global_queue(0,0), ^{ 
     __typeof__(self) sself = wself; 
     [sself->dataArray addObject: @"Hello World"]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
     [NSThread sleepForTimeInterval: 30]; 

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle: sself->dataArray[0] 
                 message: @"Message" 
                 delegate: nil 
               cancelButtonTitle: @"OK" 
               otherButtonTitles: nil]; 
     [alert show]; 
     }); 
    }); 
} 

@end 
  1. 이 메인 큐 블록 내에서 sself 액세스하는 적절한 방법인가?
  2. 초기 대기열이 완료되면 sself이 범위를 벗어 납니까?
  3. 메인 대기열 블록에 __typeof__(self) sself = wself;을 추가해야합니까?
+2

덧붙여서,이 특별한 예에서는 원하지 않는 경우이'weakSelf' /'strongSelf' 패턴을 사용하지 않아도됩니다. 이 작업을 실제로하고 싶은 곳은 강력한 참조주기가있는 곳입니다. 그러나 귀하의 다른 질문과는 달리 잠재적 인 강력한 참조주기는 없습니다.이 함수는 (sleepForTimeInterval에 의해 표현 된 코드가 실행되는 동안 객체가 실제로 유지되는 것에 대해 정말로 염려한다면) 앱에 대해 이해가된다면 분명히 'weakSelf' /'strongSelf' 댄스를 수행 할 수 있습니다.하지만 주목할 가치가 있습니다 당신은이 경우에는 필요가 없습니다. – Rob

답변

1

를 사용하여 당신은 질문 :

이 메인 큐 블록 내에서 sself에 액세스 할 수있는 적절한 방법이 있나요?

거의. sselfnil이 아닌지 확인해야합니다. nil 포인터가있는 역 참조를 사용하면 앱이 다운 될 수 있기 때문에이 작업을 수행 할 수 있습니다.

- (void) doSomething 
{ 
    typeof(self) __weak wself = self; 
    dispatch_async(dispatch_get_global_queue(0,0), ^{ 
     typeof(self) sself = wself; 
     if (sself) { 
      [sself->dataArray addObject: @"Hello World"]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
      [NSThread sleepForTimeInterval: 30]; 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle: sself->dataArray[0] 
                  message: @"Message" 
                  delegate: nil 
                cancelButtonTitle: @"OK" 
                otherButtonTitles: nil]; 
      [alert show]; 
      }); 
     } 
    }); 
} 

그런 다음 질문 :

sself 초기 큐가 완료되면 범위를 벗어나 가시겠습니까 따라서, 반드시 그렇지 nil의 확인하십시오?

범위를 벗어나지 만 내부 블록이 보유하고 내부 블록이 완료 될 때까지 유지됩니다.

메인 대기열 블록에 __typeof__(self) sself = wself;을 추가해야합니까?

원할 수도 있지만 필수는 아닙니다. 원하는 동작에 따라 다릅니다. 예를 들어 현재 객체 (보기 컨트롤러 일 가능성 있음)가 해제 된 경우에도이 경고를보고 싶다면 sself 패턴을 사용하십시오 (아마 dataArray에 액세스 할 수 있도록 잠시 멈춤을 원하기 때문일 수 있습니다). 경고를 더 이상 표시하고 싶지 않으면이/strongSelf 춤을 반복하십시오.

2
  1. 예, 맞습니다.
  2. 아니요, main_queue 블록에서 사용할 수 있습니다.
  3. 아니요, 아닙니다. global_queue 블록에서도 __typeof__(self) sself = wself;을 추가 할 필요가 없습니다. 필요하지 않습니다. 이미 약화 된 자체 객체 wself을 보유하고 있습니다 (또한 블록 내에 __typeof__(self) 부분에 self을 보유하게됩니다).
  4. __typeof__을 사용할 필요가 없습니다. 단순히 typeof(self)
관련 문제