0

블록 내에서 자기를 캡처하는 것을 피하는 일반적인 패턴은 블록 외부에 약한 자기를 생성하고이를 사용하여 블록 내에서 "로컬에서 강한"버전의 자기 (내부 자기)를 생성하는 것입니다.약한 포인터를 강한 포인터에 할당하면 해당 개체가 복사됩니까?

__weak ClassX *weakSelf = self; 
[someOtherObject methodThatTakesCOmpletionBlock: ^{ 

      ClassX innserSelf = weakSelf; //innserSelf creation?  
      [someObject send:innerSelf.prop;}]; 

innserSelf creation 행이 실행되면 어떻게됩니까? 을 someOtherObject으로 보내면 innerSelf사본은입니다.

이 질문은 innserSelf 행이 실행될 때 일어나는 일에 초점을 맞 춥니 다. 나는 Strong reference to a weak references inside blocks을 보았지만이 점에 대해서는 언급하지 않았다.

+0

@ Josh Caswell 답변으로 내 질문 중 하나가 해결되지 않았습니다. 'ClassX innserSelf = weakSelf;'행이 실행되면 어떻게됩니까? 자체 객체를 복사하고 참조를 유지합니다. 이 질문 만 편집했습니다. 경향 깃발을 제발 제거 할 수 있니? –

+0

포인터를 지정하지 않으면 개체의 복사본이 만들어집니다. –

+0

"포인터를 지정하지 않으면 복사본이 만들어지지 않습니까?"라는 의미는 무엇입니까? "포인터 할당은 복사하지 않습니다 **"라고 말하고 싶습니까? 그것이 복사본을 만들지 않는다면,이 내적 자체의 전체적인 점은 무엇입니까? 자아가 지적한 "기억의 조각"에 대한 강한 참고가 여전히있는 것 같습니다. –

답변

0

약한 포인터를 강한 포인터에 할당해도 개체가 복사되지 않습니다. 두 포인터는 동일한 객체를 가리 킵니다. 강한 포인터는 보유 수에 +1을 더합니다. 약한 포인터가 고려 카운트를

+0

감사합니다. 이 경우 다시 참조주기가 없습니까? 블록은 self (innersole을 통한)에 대한 강한 참조를 가지고 있으며 self는 블록에 대한 문자열 참조를가집니다.이것과 블록 내에서 직접 사용하는 것의 차이점은 무엇입니까? –

+1

참조주기는 블록이 실행 중일 때만 존재합니다. 어느 것이 바람직합니다. – bbum

+0

@bbum, 감사합니다. 주제와 관련된 모든 게시물을 읽을 때 위의 코드는 weakSelf, innerSelf 댄스를 사용하지 않더라도 유지주기를 생성하지 않는 것으로 보입니다. 이것은 블록을 다른 객체로 전달하기 때문에 발생합니다. 나는 그것을 자기의 재산에 보관하지 않을 것이다. 그게 올바른 이해인가? –

2

를 유지 변경하지 않습니다

__weak id weakSelf = self; 
[other doSomething: ^{ 
    __strong id strongSelf = weakSelf; 
    .... 
}]; 

other 복사 블록이 더 강한 참조가없는

.

other이 블록을 실행하면 블록 실행이 시작될 때 강력한 참조가 만들어집니다. 블록이 완료되면 실행 범위가 사라지고 strongSelf 참조가 삭제됩니다.

other이 블록에 걸려 있는지 여부는 관계가 없습니다. strongSelf 참조 은 블록 실행 중에 만 존재합니다..

+0

고마워요. @ 앨범. 시간 블록이 실행될 때자가 할당이 해제되면 어떻게됩니까? 그럼 강해지는자가 없겠지, 맞습니까? 그 블록을 저장하고있는 '기타'에 대한 제 질문은 위험한 약점/자기 춤을 겪지 않는 상황을 찾아내는 것이 었습니다. 유일한 문제는 다른 블록이 블록을 저장하는 속성을 가진 경우입니다. 방금 실행하면 내부 자체가 아니라 "직선"자기가되는 것이 좋습니다. 이렇게하면 self가 블록이 실행될 때 존재하게됩니다. 완료되면 블록은 강력한 참조를 해제하여 사이클을 중단합니다. 생각? –

+0

@SmartHome Correct; 'strongSelf'는 제로가 될 것입니다. 원하는 경우 다음 줄에서 테스트하여 블록을 단락시킬 수 있습니다. ARC 하에서 약한/강한 할당 메커니즘은 원자 적입니다. 당신은 잘못된 '강한 자신'을 원한다. – bbum

+2

블록이 실행되지 않으면 위험 할 수 있습니다. 사이클을 중단하기 위해 블록 실행이 필요한 부분을 수행하는 경우 블록이 실행되지 않으면 사이클을 중단하지 않을 위험이 있습니다. 'other'가 실행을 지연 시키거나 실행을 직접 지시 한 다음 호출자의 지시에 의존하는지 여부를 노출함으로써 리팩터링이 어렵고 오류가 발생하기 쉬운 구현 세부 사항을 노출합니다. self -> weakSelf -> strongSelf 댄스는 코드에 노이즈를 추가하는 것보다 오류가 발생하지 않습니다. – bbum