Копирует ли объект присвоение слабого указателя сильному указателю?

Обычная схема, позволяющая избежать захвата себя внутри Блока, состоит в том, чтобы создать слабое Я вне Блока и использовать его для создания "локально сильной" версии себя внутри Блока (внутреннее я).

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

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

Что происходит, когда innserSelf creation строка выполнена? Является innerSelf копия себя в то время метод methodThatTakesCompletionBlock: отправлено someOtherObject?

Этот вопрос фокусируется только на том, что происходит при выполнении строки innserSelf. Я видел сильную ссылку на слабые ссылки внутри блоков, которая связана, но не решает эту проблему.

2 ответа

Рассматривать:

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

когда other копирует блок, нет сильной ссылки.

когда other выполняет блок, затем создается сильная ссылка в начале выполнения блока. Когда блок сделан, область выполнения исчезла и, таким образом, strongSelf ссылка уничтожена.

Будь то other висит на блоке или нет не имеет значения; strongSelf ссылка существует только во время выполнения блока.

Присвоение слабого указателя сильному не копирует объект. Оба указателя будут указывать на один и тот же объект. Сильный указатель сохраняет таким образом добавление +1 к счету удержания. Слабый указатель не изменяет счет удержания