En el ejemplo siguiente, no entiendo por qué localVariable
se está accediendo por valor en doSomethingWithObject
. ¿Qué hace esa conversión? ¿Cómo distingue entre acceder a una variable por valor y acceder a ella por referencia? Me gustaría ver más ejemplos relacionados si es posible.Acceso a las variables por valor o referencia
El siguiente es un extracto de Blocks Programming Topics de Apple y muestra cómo las variables de instancia se conservan en bloques.
Si utiliza un bloque dentro del implementación de un método, las reglas para la gestión de memoria del objeto variables de instancia son más sutiles:
- Si accede a una variable de instancia por referencia,
self
Es retenido;- Si accede a una variable de instancia por valor, la variable se conserva.
Los siguientes ejemplos ilustran las dos situaciones diferentes:
dispatch_async(queue, ^{ // instanceVariable is used by reference, self is retained doSomethingWithObject(instanceVariable); }); id localVariable = instanceVariable; dispatch_async(queue, ^{ // localVariable is used by value, localVariable is retained (not self) doSomethingWithObject(localVariable); });
No estoy seguro de entender perfectamente esto ... pero gracias por la explicación de todos modos. – Pablo
@Dave, no el mío. Sin embargo, no puedo conectar la última oración con el resto de tu explicación. "Eso" implica ¿a qué? Tampoco puede obtener la parte de const copy. Por lo que puedo entender simplemente es que si puedes sustituir ivar con self-> ivar, entonces self se conserva, si no se puede, entonces se conserva ivar. Pero lo que es 'por valor',' por ref' todavía no está claro para mí. Lo siento. – Pablo
@Michael respuesta actualizada –