2012-08-29 6 views
10

Duplicar posible:
How does an underscore in front of a variable in a cocoa objective-c class work?iOS: Uso de uno mismo y el guión bajo (_) con la variable

me han sido muy confundido con el uso de uno mismo o un guión con el nombre de la 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 entendimientos cuando uso self.users, OS se asegurará de rel facilitar la memoria previamente asignada en el método set para que no tengamos que preocuparnos explícitamente.

_users es una variable de instancia para los usuarios y se debe utilizar normalmente al acceder a la variable de los usuarios. Si utilizo _users para cambiar su valor, entonces no se activará el delegado de KVO, que no notificará a una clase que observa el cambio de valor de los usuarios.

Por otra parte, self.users permite diferenciar 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 entendí mal o falta durante el uso de _users o self.users. Gracias.

+0

Hola @qegal He revisado ese hilo y si lees mi pregunta, la mayoría de los puntos son los puntos finales, pero lo que no pude obtener es cuándo usar qué! – applefreak

Respuesta

8

Creo que ayuda considerar cómo el compilador implementa las propiedades (o podría implementarlas).

Cuando se escribe self.users = array; el compilador traduce esto a [self setUsers:array]; Cuando se escribe array = self.users; el compilador traduce esto a array = [self users];

@synthesize añade una Ivar a su objeto (a menos que ha añadido usted mismo), e implementa la -users y -setUsers: métodos de acceso para que (a menos que proporcione su propio)

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á habilitada), -setUsers: se verá algo como *:

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

* - Tenga en cuenta que esta es una implementación simplificada, no atómica de -setUsers:

+0

¡Gracias, Nick! – applefreak

+0

La única respuesta sobre este tema que habla de la diferencia desde una perspectiva de recuento de referencias con tanta elegancia. Excelente. – Ash

31

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

cuando está utilizando el _users, accede a la propiedad directamente omita el setter o getter.


aquí es 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 comprador también.


acerca de la gestión básica de memoria (en caso de MRR o ARC): el IOS se dealloc del objeto si es que no haya más fuerte puntero que lo mantiene con vida, no importa cómo se libera el puntero del objetos.

+3

estimado ** Votantes abajo **! Hubiera sido un honor para mí recibir algún comentario sobre por qué sus manos temblaban sobre el botón del votante de abajo porque, creyeron o no, no soy un lector de mentes para descubrirlo. ¡gracias! – holex

+0

No estoy seguro de cómo se refería a eso: _ "Muestra un abuso de 'yo' y ..." _, ¿podría dar más detalles, por favor? la _ demostración buena_ muestra la __diferencia__ entre pasar y llamar al _juego_juego dentro del setter, lo que causaría un bucle recursivo infinito y se bloquea cuando la pila se desborda, por lo que el enfoque final es evitar causar bucles infinitos en el tiempo de ejecución. – holex

2

Sí, eso es más o menos correcta. Un par de puntos menores:

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

Con la última versión de Toolchain del desarrollador (Xcode 4.4+), ya no tiene que sintetizar manualmente las propiedades: se sintetizan automáticamente (con el subrayado inicial).

+0

Gracias Jim. Intenté Xcode 4.4 con iOS 6 y sí, no requiere propiedades de sintetización, pero ¿funcionaría esa aplicación en la versión inferior de iOS? – applefreak

+1

Sí, según la documentación oficial: [La característica predeterminada '@ sintetizar' no requiere SDK especial ni soporte en tiempo de ejecución.] (Http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles /xcode_4_4.html#//apple_ref/doc/uid/TP40011649-SW11) Preguntas como esa, debe leer la documentación. – Jim

Cuestiones relacionadas