В приведенном ниже примере я не понимаю, почему доступ к localVariable
осуществляется по значению в doSomethingWithObject
. Что делает это преобразование? Как отличить доступ к переменной по значению от доступа к ней по ссылке? Я хотел бы увидеть больше связанных примеров, если это возможно.
Ниже приводится отрывок из Темы программирования блоков Apple и показано, как переменные экземпляра сохраняются в блоках.
Если вы используете блок внутри реализация метода, правила для управления памятью объекта переменные экземпляра более тонкие:
- Если вы обращаетесь к переменной экземпляра по ссылке,
self
сохраняется;- Если вы обращаетесь к переменной экземпляра по значению, переменная сохраняется.
Следующие примеры иллюстрируют две разные ситуации:
dispatch_async (queue, ^ { // instanceVariable используется по ссылке, self сохраняется doSomethingWithObject (instanceVariable); }); id localVariable = instanceVariable; dispatch_async (очередь, ^ { // localVariable используется по значению, localVariable сохраняется (не self) doSomethingWithObject (localVariable); });