En arco, qué sucede cuando no sintetizas

En un proyecto habilitado para iOS ARC, ¿qué sucede cuando no sintetizo una propiedad, ya que no se permiten retener / liberar?

@interface SomeClass : NSObject { NSMutableArray* _pieces; } @end 

¿Cuál es la semántica de memory de iVar _pieces en este caso? Digamos que lo configuré usando, _pieces = whatever .

¿Se establecen las piezas en nil cuando se desasigna la instancia de mi SomeClass? ¿Se almacenan las piezas como una reference débil? Si todos los demás objects que han retenido _pieces lo liberan, ¿será nulo cuando bash acceder a él?

Un par de observaciones, muchas de las cuales probablemente estén claras en este punto basadas en la retroalimentación de los demás:

  1. Usted sintetiza las properties, no las variables de instancia, y en su ejemplo, nos mostró un ejemplo de una variable de instancia, no una propiedad.

  2. Su pregunta podría implicar alguna connection asumida entre sintetizar y la capacidad de hacer retain / release , pero no existe tal connection. La capacidad de retain y release depende de si está utilizando ARC o no. No tiene nada que ver con sintetizar properties.

  3. Como otros han observado, las variables de instancia explícitamente declaradas, como su ejemplo, son references strong , de forma pnetworkingeterminada. Entonces, en su ejemplo, _pieces es una strong reference.

  4. Sí, cuando su object SomeClass se desasigna, eliminará su strong reference al object _pieces . Obviamente, si esa es la última reference fuerte al object señalado por _pieces , será desasignado y cualquier otra reference weak que tenga en otro lugar se establecerá en nil . Para una discusión más completa sobre la administración de la memory, consulte la Guía de progtwigción avanzada de administración de memory de Apple y la transición a ARC .

  5. Preguntó: "Si todos los demás objects que han retenido _pieces liberan, ¿será nil cuando bash acceder a él?" Obviamente, eso sería cierto si _pieces fuera una reference weak , pero dado que es una reference implícita en SomeClass , no, ese no es el caso.

  6. Si desea hacer que las pieces una propiedad declarada , la syntax sería

    @property (nonatomic, strong) NSMutableArray* pieces;

    La designación de strong vs. weak (o lo que sea) dicta la gestión de la memory de la propiedad.

  7. Si declara una propiedad, no solo ya no tendrá que definir explícitamente la variable de instancia, sino que ahora se le aconseja que no debería hacerlo (porque cuando se sintetiza, el comstackdor creará el ivar por usted). Pero, si tiene una variable de instancia explícitamente declarada del nombre correcto para su propiedad, el comstackdor la usará para la propiedad. Pero eso no solo es innecesario, sino que también es desaconsejable (porque si escribe mal el nombre de la variable de instancia, puede terminar involuntariamente con dos variables de instancia). Solo deja que el comstackdor sintetice tus variables de instancia para tus properties y esta potencial ambigüedad desaparece.

  8. El nombre de la variable de instancia que se sintetizará para una propiedad se rige por la syntax de la directiva de implementación de properties , es decir, la instrucción @synthesize . Por lo tanto, si tiene una statement @synthesize para su propiedad de pieces del formulario:

    @synthesize pieces;

    entonces la variable de instancia se denominará pieces . Pero si usa la syntax @synthesize preferida de:

    @synthesize pieces = _pieces;

    entonces el nombre de la variable de instancia tendrá el guión bajo precedente (que es, por convención, preferido, para evitar la ambigüedad en el código entre las properties y las variables de instancia). Y, a partir de Xcode 4.4, si se omite la instrucción @synthesize para una @property , se la sintetizará implícitamente con la última syntax, es decir, la variable de instancia tendrá el guión bajo principal).

Suponiendo que no ha creado una propiedad que utiliza esto, que anula el comportamiento supuesto , las variables de instancia en los proyectos ARC se asumen fuertes, por lo que la statement realmente es

 @interface SomeClass : NSObject { __strong NSMutableArray* _pieces; } @end 

Entonces, en respuesta a tus preguntas

¿Se establecen las piezas en nil cuando se desasigna la instancia de mi SomeClass?

No, pero asignarle una instancia no hará que se desasigne.

¿Se almacenan las piezas como una reference débil?

No, es una fuerte reference.

Si todos los demás objects que han retenido _pieces lo liberan, ¿será nulo cuando bash acceder a él?

No, esta es la misma pregunta que la primera.

¿Estás declarando una propiedad llamada pieces o es un ivar recto?

Si define una propiedad, el uso de la memory depende de cómo defina la propiedad.

Si se trata de un ivar consecutivo, entonces por defecto el ivar será strong . Esto básicamente significa que el ivar retendrá y liberará correctamente el object que le asigne. Puede usarlo con security sin preocuparse por ello.

A mi leal saber y entender, ARC lo tratará como lo tratarías de una manera similar a strong . Cuando lo asigna, el valor entrante se retain y el valor que ya no apunta será el de release d. Solo se cuelga si de alguna manera se vuelve a liberar. Si tiene una statement de properties, ARC cumplirá con las reglas especificadas allí, y los @synthesize someObject = _someObject se sintetizarán automáticamente en el formulario @synthesize someObject = _someObject . Cuando el object se desasigna, presumo que el object recibe la release enviada release modo que si nada más ha afirmado la propiedad, el object apuntado por el puntero también será desasignado.

con el nuevo time de ejecución solo necesitas @properties btw – no declaras ivars, no sintetizas