¿Existe un atributo de propiedad Objective-C que imita la funcionalidad de la palabra key __block?

Quiero hacer una propiedad que permita a un bloque actualizar sus contenidos. Para una variable típica (es decir, no auto sintetizada, etc.), prefiero la statement con __block .

¿Hay alguna manera de hacer una propiedad que pueda ser actualizada por un bloque?

Editar: Algunas respuestas dicen solo para usar el método de establecimiento de properties. Lo que realmente quiero hacer es agregar objects a una matriz mutable, así que realmente no quiero crear una nueva matriz mutable y volver a establecerla en la propiedad usando setProperty: o .property = cada vez. ¿Es posible modificar la propiedad sin todas estas asignaciones de memory?

No hay necesidad de poner nada en una statement de @property . ya que se puede acceder y modificar por bloques sin ningún problema. De acuerdo con la documentation:

Dentro del cuerpo de código del object de bloque, las variables pueden tratarse de cinco forms diferentes.

Puede hacer reference a tres types estándar de variables, tal como lo haría con una function:

  1. Variables globales, incluidos los locales estáticos.
  2. Las funciones globales (que técnicamente no son variables)
  3. Variables locales y parameters de un ámbito adjunto

Los bloques también admiten otros dos types de variables:

  1. En el nivel de function son __block variables. Estos son mutables dentro del bloque (y el ámbito adjunto) y se conservan si se copy cualquier bloque de reference en el montón.
  2. const importa

Las siguientes reglas se aplican a las variables utilizadas dentro de un bloque:

  1. Se puede acceder a las variables globales, incluidas las variables estáticas que existen dentro del ámbito léxico adjunto.
  2. Los parameters pasados ​​al bloque son accesibles (al igual que los parameters de una function).
  3. Las variables de stack (no estáticas) locales al ámbito léxico que las contiene se capturan como variables const .
    Sus valores se toman en el punto de la expresión de bloque dentro del progtwig. En bloques nesteds, el valor se captura desde el scope adjunto más cercano.
  4. Las variables locales al scope léxico que se declaran con el modificador de almacenamiento __block se proporcionan por reference y también son mutables.
    Cualquier cambio se refleja en el scope léxico adjunto, incluyendo cualquier otro bloque definido dentro del mismo scope léxico adjunto.
  5. Variables locales declaradas dentro del scope léxico del bloque, que se comportan exactamente como las variables locales en una function.
    Cada invocación del bloque proporciona una nueva copy de esa variable. Estas variables, a su vez, pueden usarse como const o como variables de reference en bloques dentro del bloque.

__block se usa para declarar las variables locales que un bloque podría querer cambiar.

Tampoco son properties variables locales, ni hay necesidad de cambiar una variable cuando todo lo que quiere hacer es agregar algo a una matriz mutable. La variable no cambia, es el estado del object detrás de la variable que cambia.

Esta no es la manera correcta de pensar en ello. Desea modificar un object, que tiene una propiedad. Entonces capturas el object en el bloque y llamas a sus setFoo: ( setFoo: para modificar la propiedad.


EDITAR: a partir de las diferentes ediciones, puede estar confundiendo cómo funcionan los objects ObjC y cómo funciona C ++. ObjC solo utiliza pointers a los objects, rara vez los copy, y carece del concepto de un object const (hay objects inmutables, pero es porque no tienen mutantes, no puedes const un object mutable como puedas en C ++) .

__block solo significa que "esta variable (no el object señalado por ella, esta variable real) debe pasarse por reference en el bloque en lugar de por el valor)". Entonces cuando digo:

 __block id foo; 

Esto significa que el puntero foo sí mismo puede cambiarse. No tiene nada que ver con si el object señalado por foo puede ser mutado. Esto no tiene sentido para un global o un ivar. ivars son implícitamente campos de estructura. Cuando dices _ivar dentro de un bloque, el comstackdor lo convierte implícitamente en self->_ivar y luego se captura a self . No captura _ivar (ya que eso es solo una compensación en la autoestructura). Es mejor hacer lo mismo con los accesores, ya que es mucho más explícito lo que estás haciendo, y puedes usar __weak esa manera.

Utiliza __bloque cuando quiere modificar una variable dentro de un bloque; en su caso, lo que quiere hacer es no modificar la variable (aún apuntará a la misma NSMutableArray ) sino simplemente enviarle un post ( addObject: . No necesitas __bloque para eso.