블록에 대한 약한 참조에 대한 기본적인 이해가 있습니다. 내가 직면하고 문제는자기 내부에 액세스하는 블록의 보유 개수를 이해합니다.
내가 블록 내부 자기에 액세스 할 때마다는 내가 기본 블록 (예 UIViewAnimation)을 유지 카운트 내부 자체를 액세스 할 때 2, 증가 도착 자기의 수를 유지한다 자기를 위해 그냥 미리 2
감사 증가지고 이유를 이해하고 싶었다 1.
증가됩니다!
블록에 대한 약한 참조에 대한 기본적인 이해가 있습니다. 내가 직면하고 문제는자기 내부에 액세스하는 블록의 보유 개수를 이해합니다.
내가 블록 내부 자기에 액세스 할 때마다는 내가 기본 블록 (예 UIViewAnimation)을 유지 카운트 내부 자체를 액세스 할 때 2, 증가 도착 자기의 수를 유지한다 자기를 위해 그냥 미리 2
감사 증가지고 이유를 이해하고 싶었다 1.
증가됩니다!
블록 내부에서 자기를 사용하면 보통 2 씩 증가하는 이유가 될 수있는주기가 만들어집니다.이를 수정하려면 약한 자기를 사용해보십시오. 이
__unsafe_unretained 대해서 typeof (자기)처럼
capturing self strongly in this block is likely to lead to a retain cycle
사용 뭔가 weakSelf = 자신이 질문을 확인;
블록 내에서 'self'를 사용하여 사이클을 생성하지 않습니다. 블록에서 'self'에 대한 참조를 생성합니다. 사이클을 만들 때만 사이클을 생성합니다. 'self'에서 블록으로의 참조를 유지하는 경우입니다. 그것은 여기서 일어나는 것이 아닙니다. – newacct
Objective-C 블록의 코드를 생성하는 Clang 소스 코드에 따르면. CGObjC.cpp
오브젝티브 C 블록 리터럴 CGDecl.cpp
EmitBlockLiteral
은 함수에 의해 생성된다. llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
LLVM document은 무엇이 블록 리터럴인지 깊이 설명합니다. 어쨌든이 함수는 지정된 블록의 블록 설명 자 및 복사 도우미 함수를 생성합니다. 복사 도우미 함수는 자동 변수 및 self
을 캡처합니다. GenerateCopyHelperFunction
함수에서
buildBlockDescriptor -> buildCopyHelper -> GenerateCopyHelperFunction
는 연타 블록에 의해 포착 될 각 오브젝티브 C 객체 자동 변수 objc_storeStrong
을 방출한다.
for (const auto &CI : blockDecl->captures()) {
...
EmitARCStoreStrongCall(...
따라서이 줄의 보유 수는 self
(1 -> 2)입니다.
그런 다음 EmitBlockLiteral
함수는 블록에 의해 캡처 될 각 Objective-C 개체 자동 변수에 대해 objc_retain
을 방출합니다.
// Next, captured variables.
for (const auto &CI : blockDecl->captures()) {
...
EmitExprAsInit -> EmitScalarInit -> EmitARCRetain
따라서이 줄의 보유 수는 self
(2 -> 3)입니다.
정확한 이유를 모르겠습니다. 그러나 블록 복사 도우미 함수로 객체를 캡처하기 전에 Objective-C 객체를 유지해야하는 몇 가지 이유가 있습니다.
블록은 참조가 유효하게 유지되도록 '캡처 된'iVars를 보유하려고합니다. 즉, 'self'가 실행되기 전에 할당 해제되지 않습니다.이것에 대한 좋은 정보는 여기에서 찾을 수 있습니다. (MRC와 ARC에 대한 다른 치료법) http://stackoverflow.com/questions/19227982/using-block-and-weak – YvesLeBorg
약점을 잘 이해하려면 https : //dhoerl.wordpress를 읽으십시오. co.kr/2013/04/23/i-finally-fig-out-weakself-and-strongself/ –
http://whentouserecount.com – jrturton