4

У меня есть базовое понимание слабой ссылки с блоками. Проблема я столкнулся в том,Понимание количества задержек с блокированием доступа к нему внутри.

Всякий раз, когда я достигаю себя внутри блока, сохранить счетчик себя получает увеличился на , где, как, когда я доступ себя внутри блока по умолчанию (например, UIViewAnimation) Сохранять счета для себя получает увеличивается на 1.

Просто хотел, чтобы понять, почему это становится увеличилось на 2. enter image description here

заранее спасибо!

+0

Блок захочет сохранить «захваченные» iVars (например, self), чтобы гарантировать, что ссылка остается в силе ... то есть, что 'self' не освобождается, прежде чем она будет выполнена.Вы найдете хорошую информацию об этом здесь (другое обращение к MRC и ARC. Http://stackoverflow.com/questions/19227982/using-block-and-weak – YvesLeBorg

+1

Также для лучшего понимания слабого чтения https: //dhoerl.wordpress. com/2013/04/23/i-finally-figured-out-weakself-and-strongself/ –

+5

http://whentouseretaincount.com – jrturton

ответ

-1

Использование self внутри блока, как правило, создает цикл, который может быть причиной увеличения на 2. Чтобы исправить это, вы должны попробовать использовать слабое я. Проверьте этот вопрос из

capturing self strongly in this block is likely to lead to a retain cycle

использовать что-то вроде этого
__unsafe_unretained TYPEOF (само) weakSelf = я;

+0

Использование 'self' внутри блока не создает цикл. Он создает ссылку из блока на 'self'. Он создает цикл только в том случае, если вы делаете цикл - если вы сохраняете ссылку от 'self' до блока. Это не то, что здесь происходит. – newacct

1

Согласно исходному коду Clang для генерации кода блоков Objective-C.

Objective-C блоки буквенные порождается EmitBlockLiteral функции.

llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) { 

LLVM document объясняет глубоко, что блок буквальным. В любом случае эта функция генерирует дескриптор блока и вспомогательную функцию копирования указанного блока. Вспомогательная функция копирования предназначена для записи автоматических переменных и self.

buildBlockDescriptor -> buildCopyHelper -> GenerateCopyHelperFunction 

В GenerateCopyHelperFunction функции, Clang излучает objc_storeStrong для каждого Objective-C объект автоматической переменной, которая будет захвачен блоком.

for (const auto &CI : blockDecl->captures()) { 
    ... 
    EmitARCStoreStrongCall(... 

Таким образом, эта линия будет подсчитывать сохранить кол self (1 -> 2).

После этого функция EmitBlockLiteral испускает objc_retain для каждой переменной объекта объекта Objective-C, которая также будет захвачена блоком.

// Next, captured variables. 
for (const auto &CI : blockDecl->captures()) { 
    ... 
    EmitExprAsInit -> EmitScalarInit -> EmitARCRetain 

Поэтому эта строка будет подсчитывать сохранить кол self тоже (2 -> 3).

Я не знаю точно, почему. Но, по-видимому, есть некоторая причина, чтобы сохранить объект Objective-C перед захватом объекта с помощью вспомогательной функции копирования блока.

 Смежные вопросы

  • Нет связанных вопросов^_^