0

메인 대기열에서 작업을 실행하기 위해 dispatch_async 메소드를 사용하고 있습니다. 그러나 순환 유지의 원인 :dispatch_async 중첩 블록

self.test = ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"%@", self); 
     }); 
    }; 

이 사이클을 유지 만드는 이유를 제대로 얻을 수 아니다 :

다음은 코드입니다. 내 컨트롤러에는 dispatch_async 블록의 소유권이 없습니다. 이 같은 self 살아 번에 파견, 어쩌면 뭔가를 유지 할 수 있도록 내부 블록을 원하지 않는 경우

__weak typeof(self) weakSelf = self; 

self.test = ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"%@", weakSelf); 
    }); 
}; 
+1

속성'test'는 클로저를 유지하고 클로저는'self'에 대한 참조를 포함합니다. 참조 자체는 블록에 있습니다. – Paulw11

답변

1

weakSelf를 사용해보십시오

typeof(self) __weak weakSelf = self; 
self.test = ^{ 
    typeof(self) strongSelf = weakSelf; 
    if (strongSelf) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"%@", strongSelf); 
     }); 
    } 
}; 
+0

그렇지만'self'는 외부 블록의 실행 사이에서 할당 해제 될 수 있습니다그리고 그가 원하는 것이 아닐 수도있는 내부 블록의 (비동기적인) 실행 – newacct

0

외부 블록은 self을 유지하지만, 원하는 :