¿Qué significa exactamente la __blockpalabra 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

__blocken absoluto.__blockdeberí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
localCounterylocalCharacterse modifican antes de que se llame al bloque. Sin embargo, dentro del bloque, solo la modificación alocalCharactersería visible, gracias a la__blockpalabra clave. Por el contrario, el bloque puede modificarselocalCharactery esta modificación es visible fuera del bloque.fuente
localCounter, pero modificalocalCharacter. Además, preste atención al valor quelocalCountertiene 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
__blockveces se usa para evitar retener ciclos ya que no retiene el argumento. Un ejemplo común es el uso de uno mismo.fuente
__weaksuficiente 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
__blockes 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