Зачем использовать копию для свойств блока?

Почему свойства блока должны быть объявлены как копии?

typedef void(^Thunk)(void);
@property (nonatomic, copy) Thunk block;

Зачем нужна копия блочного объекта?

3 ответа

Потому что в стеке создается блок-литерал и будет уничтожен при выходе из функции. При сохранении блока вокруг него необходимо его скопировать.


Если вы собираетесь использовать блок за пределами области, где он был определен, вам нужно сделать его копию, потому что он копирует его в кучу. Исходный блок выделяется в стеке, и поэтому он будет освобожден, когда он выйдет за пределы области действия, иначе, когда метод или блок кода, который был определен в завершении. Чаще всего блоки используются для асинхронных действий, поэтому часто вам нужно это делать.


В стеке создается блок и фиксирует состояние для распределения стека. Вам необходимо выполнить копию:

  • скопировать блок
  • скопировать свое захваченное состояние
  • и сформировать сильные ссылки на objc_objects

... чтобы вы могли безопасно использовать блок за пределами лексической области, в которой он был создан.

licensed under cc by-sa 3.0 with attribution.