1, 2) Блоки сохраняют в себе указатели на объекты (любые блоки, блоки dispatch_async — ничего особенного). Обычно это не проблема, но может привести к циклам сохранения, поскольку блок может быть связан с объектом-владельцем, и этот объект-владелец (часто self
) может сохраняться блоком. В этом случае вы должны использовать слабую переменную, а затем переназначить ее для сильного захвата:
__weak MyClass *weakSelf = self;
self.block = ^{
MyClass *strongSelf = weakSelf;
...
[strongSelf ...];
[strongSelf.property ...];
[strongSelf->iVar ...];
}
Примечание. Если вы обращаетесь к iVar напрямую, компилятор преобразует его в self->iVar и, таким образом, сохраняет self!
3) Блоки сохраняют только указатели, но не копируют их.
4) Переменные, созданные внутри блока, принадлежат этому блоку и будут освобождены, когда этот блок выйдет за пределы области действия.
person
Fabian Kreiser
schedule
31.08.2012
__block
, теперь создающие сильную ссылку, изменились. - person zaph   schedule 04.05.2013