¿Qué significa exactamente la __block
palabra clave en Objective-C? Sé que te permite modificar variables dentro de bloques, pero me gustaría saber ...
- ¿Qué le dice exactamente al compilador?
- ¿Hace algo más?
- Si eso es todo lo que hace, ¿por qué es necesario en primer lugar?
- ¿Está en los documentos en alguna parte? (No puedo encontrarlo).
objective-c
ios
objective-c-blocks
mjisrawi
fuente
fuente
__block
en absoluto.__block
deberían traducirse a Swift: "Los cierres [en Swift] tienen una semántica de captura similar a los bloques [en Objective-C] pero difieren en una forma clave: las variables son mutables en lugar de copiadas. En otras palabras, el comportamiento de __block en Objective-C es el comportamiento predeterminado para las variables en Swift ". Del libro de Apple: Uso de Swift con Cocoa y Objective-C (Swift 2.2).Respuestas:
Le dice al compilador que cualquier variable marcada por él debe tratarse de una manera especial cuando se usa dentro de un bloque. Normalmente, las variables y sus contenidos que también se usan en bloques se copian, por lo que cualquier modificación realizada a estas variables no se muestra fuera del bloque. Cuando están marcados con
__block
, las modificaciones realizadas dentro del bloque también son visibles fuera de él.Para obtener un ejemplo y más información, consulte El tipo de almacenamiento __block en los Temas de programación de bloques de Apple .
El ejemplo importante es este:
En este ejemplo, ambos
localCounter
ylocalCharacter
se modifican antes de que se llame al bloque. Sin embargo, dentro del bloque, solo la modificación alocalCharacter
sería visible, gracias a la__block
palabra clave. Por el contrario, el bloque puede modificarselocalCharacter
y esta modificación es visible fuera del bloque.fuente
localCounter
, pero modificalocalCharacter
. Además, preste atención al valor quelocalCounter
tiene en el bloque: es 42, a pesar de que la variable aumenta antes de que se llame al bloque, pero después de que se creó el bloque (fue entonces cuando el valor se "capturó").@bbum cubre bloques en profundidad en una publicación de blog y toca el tipo de almacenamiento __block.
En cuanto a los casos de uso que encontrará, a
__block
veces se usa para evitar retener ciclos ya que no retiene el argumento. Un ejemplo común es el uso de uno mismo.fuente
__weak
suficiente en este caso específico también? Es un poco más claro quizás ...Normalmente, cuando no usa __block, el bloque copiará (retendrá) la variable, por lo que incluso si modifica la variable, el bloque tiene acceso al objeto anterior.
En estos 2 casos necesitas __block:
1.Si desea modificar la variable dentro del bloque y espera que sea visible afuera:
2.Si desea modificar la variable después de haber declarado el bloque y espera que el bloque vea el cambio:
fuente
__block es un calificador de almacenamiento que se puede usar de dos maneras:
Marca que una variable vive en un almacenamiento que se comparte entre el alcance léxico de la variable original y los bloques declarados dentro de ese alcance. Y clang generará una estructura para representar esta variable, y usará esta estructura por referencia (no por valor).
En MRC, __block puede usarse para evitar retener variables de objeto que un bloque captura. Tenga cuidado de que esto no funcione para ARC. En ARC, debes usar __weak en su lugar.
Puede consultar apple doc para obtener información detallada.
fuente
__block
es un tipo de almacenamiento que se utiliza para hacer que las variables de ámbito sean mutables, más francamente si declara una variable con este especificador, su referencia se pasará a los bloques, no a una copia de solo lectura. Para obtener más detalles, consulte la Programación de bloques en iOSfuente
Espero que esto te ayudará
supongamos que tenemos un código como:
dará un error como "la variable no es asignable" porque las variables de la pila dentro del bloque son por defecto inmutables.
agregar __block (modificador de almacenamiento) antes de la declaración lo hace mutable dentro del bloque, es decir
__block int stackVariable=1;
fuente
De la especificación del idioma del bloque :
Para obtener detalles sobre lo que debe compilar una variable __block, consulte la Especificación de implementación de bloque , sección 2.3.
fuente
Significa que la variable a la que es un prefijo está disponible para usarse dentro de un bloque.
fuente