Копирует ли объект присвоение слабого указателя сильному указателю?
Обычная схема, позволяющая избежать захвата себя внутри Блока, состоит в том, чтобы создать слабое Я вне Блока и использовать его для создания "локально сильной" версии себя внутри Блока (внутреннее я).
__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 к счету удержания. Слабый указатель не изменяет счет удержания