iOS: uso de sí mismo y guión bajo (_) con variable

Posible duplicado:
¿Cómo funciona un subrayado delante de una variable en una class de cocoa objective c?

He estado muy confundido con el uso de auto o guión bajo con nombre variable después de sintetizarlo como a continuación:

In .h file: @property(nonatomic, strong) NSMutableArray *users; In .m file: @synthesize users = _users; 

De acuerdo con mis conocimientos cuando utilizo self.users, el sistema operativo se asegurará de liberar memory previamente asignada en el método establecido, por lo que no tenemos que tener cuidado explícitamente.

_users es una variable de instancia para usuarios y debería usarse normalmente al acceder a la variable de usuarios. Si utilizo _users para cambiar su valor, no disparará el delegado de KVO que no notificará a una class que observe el cambio de valor de los usuarios.

Además, los usuarios independientes permiten diferenciar la variable ficticia en el nombre del método como a continuación,

 - (void)assignUsers:(NSMutableArray*)users { self.users = users; } 

¿Podría alguien decirme si hay algo que he entendido mal o que falta al usar _users o self.users. Gracias.

Creo que ayuda a considerar cómo las properties son (o podrían ser) implementadas por el comstackdor.

Cuando escribe self.users = array; el comstackdor lo traduce a [self setUsers:array]; Cuando escribe array = self.users; el comstackdor lo traduce a array = [self users];

@synthesize agrega un ivar a su object (a less que lo haya agregado usted mismo ) e implementa los -users y -setUsers: accessor (a less que proporcione los suyos )

Si está utilizando ARC , -setUsers: se verá algo como:

 - (void)setUsers:(NSArray *)users { _users = users; // ARC takes care of retaining and release the _users ivar } 

Si está utilizando MRC (es decir, ARC no está habilitado), -setUsers: se verá algo así como *:

 - (void)setUsers:(NSArray *)users { [users retain]; [_users release]; _users = users; } 

* – Tenga en count que se trata de una implementación simplificada y no atómica de -setUsers:

cuando está utilizando los self.users , accede a la propiedad a través del progtwigdor o getter.

cuando está utilizando _users , tiene acceso a la propiedad directamente omitir el setter o getter.


aquí hay una buena demostración de ello:

 - (void)setUsers:(id)users { self.users = users; // WRONG : it causes infinite loop (and crash), because inside the setter you are trying to reach the property via setter } 

y

 - (void)setUsers:(id)users { _users = users; // GOOD : set your property correctly } 

este es el punto en el caso del getter también.


sobre la gestión básica de la memory (en caso de MRR o ARC ): el iOS repartirá el object si no hay un puntero más fuerte que lo mantenga con vida , sin importar cómo suelte el puntero de los objects.

Sí, eso es bastante correcto. Un par de puntos menores:

iOS no libera automáticamente un object solo porque usa la notación de puntos. Libera un object cuando la propiedad se declara como copy o retain (o strong en ARC). Si, por ejemplo, está utilizando código no ARC y la propiedad se declara como assign , no liberará el object.

Con la última versión de la cadena de herramientas del desarrollador (Xcode 4.4+), ya no tiene que sintetizar las properties manualmente: se sintetizan automáticamente (con el guión bajo principal).