2015-01-23 1 views
0

블록 내에서 @synchronized(self)을하고 싶다고합시다. 나는 이것이 유지 순환으로 이어질 것입니다 생각, 그래서 일반적으로 우리는이처럼 다시 작성합니다 :이 방법을 @synchronized 지시어를 사용할 때블록에서 @synchronized (self)가주기를 유지합니까?

-(void)myMethod 
{ 
    __weak TheClass * weakSelf = self; 
    dispatch_async(dispatch_get_main_queue(), 
    ^{ 
     TheClass * strongSelf = weakSelf; 
     if(strongSelf == nil) 
     { 
      return; 
     } 

     @synchronized(strongSelf) 
     { 
      //mutex code 
     } 
    } 
} 

내 질문입니다, 그것은 @synchronized(self)에 해당?

답변

5

짧은 대답은 : 없음

긴 대답 : 직접 (

배경

이 들어 블록이 다른 객체를 참조해야합니다 블록을 포함하는 주기 수 없습니다, 그 목적은해야 또는 긴 체인을 통해) 블록을 참조하십시오.

그 자체의 사이클은 나쁘지 않습니다. 순환에서 오브젝트의 수명이 해당 오브젝트가 요구되는 지점을지나 연장되는 결과가 나올 때만 안 좋은 것입니다. 어떤 시점에서주기를 형성하는 링크 중 하나를 끊음으로써주기가 깨지는 한주기를 만드는 것이 좋습니다. 당신은 아이디어를 얻을, 변수가 중요하지 않습니다 -

__weak TheClass * weakSelf = self; 
... 
self.blockVar = ^{ 
    TheClass * strongSelf = weakSelf; 
    ... 

는 방지가 사이클 (가 참조하는 객체) self 강하게 참조 (가 참조하는 객체로 생성되는 정적 : 같은

컨스 그러나 그것에 의해 참조되는 것) blockVar 그러나 blockVar은 약한 참조가 self으로 돌아갑니다.

그러나 블록이 실행될 때마다 self 행 (strongSelf 저장) 강한 참조를 생성하고 그래서 동적 사이클 생성 - 블록의 실행이 완료하면 자동적으로 세분화된다. 코드에서

귀하의 코드

  1. 봐, 당신은 블록을 만들고 dispatch_async에 직접 전달 - 당신은 self에서 블록에 대한 참조를 저장하지 않습니다. 따라서 여기에는 어떤 사이클도 없으며 약한 참조를 전혀 사용하지 않아도됩니다.

  2. 블록에 strongSelf이 생성되면 @synchronized(strongSelf)을 사용하면 객체를 잠급니다. synchronized 문이 종료되면 잠금이 실행되고 블록이 종료되면 강력한 순환이 시작됩니다.

HTH

+1

당신의 짧은 대답은 제목에 질문에 대한 대답하지만, 문제의 마지막 문장은 또한 예/아니오 질문이다. 당신이 대답하는 것을 분명히하고 싶을 수도 있습니다. 또한, 당신은 그 마지막 질문에 답을하지 않았습니다. 예,'@synchronized (strongSelf)'는'@synchronized (self)'와 같습니다. –

+0

@KenThomases의 의견이 반영되어야합니다. 둘 다 중요한 포인트입니다. – yano