2011-10-31 13 views

Respuesta

32

__strong significa que en la asignación, el valor de r de la expresión se mantendrá y se almacenará en el lvalue utilizando la semántica primitiva. (Para desasignar un objeto así, todo lo que tiene que hacer es asignarle nil, se dará a conocer el objeto anteriormente referenciada, nil se mantendrá, lo que efectivamente hace nada y es melocotones y crema.)

__unsafe_unretained y __weak son similares en la sensación de que la dirección del valor r se asignará al valor l, pero si usa el calificador __weak, se garantiza que esta operación será atómica y estará sujeta a algunas semánticas diferentes. Una de ellas es que si el objeto que se está asignando está actualmente en desasignación, la asignación se evaluará en nil y luego se almacenará atómicamente en el valor l de la expresión. De ahí la redacción __unsafe_unretained, porque esa operación es de hecho insegura y no retenida.

__autoreleasing es como __strong excepto que tiene una advertencia: El objeto retenido es empujado hacia la piscina autorelease actual, así por ejemplo, se puede obtener la propiedad temporal de un objeto para eliminarlo de una colección y luego regresar de nuevo a la persona que llama . Hay otros usos para esto, pero en su mayoría tienen que ver con la obtención de la propiedad temporal de un objeto.

Estos comportamientos también se presentan en los modificadores de propiedad correspondientes (strong, unsafe_unretained y weak).

Véase el EDITAR Clang Automatic Reference Counting Technical Specification

: Para aquellos que no estén enfocadas iOS 5 y por lo tanto incapaz de aprovechar los beneficios de __weak, Mike Ash wrote a superb article (y la aplicación) la reducción a cero referencias débiles que se pueden utilizar en su lugar.

+0

¿Cómo se puede hacer que el objeto 'inseguro__unretain' sea más seguro? Quiero decir, si el compilador no lo convierte en 'nil' automáticamente, ¿cómo deberíamos manejar ese objeto colgante? –

+0

@MohammadAbdurraafay Puede usar '__weak' en ese caso ... –

+0

Si no estoy equivocado' __weak' no está disponible en versiones posteriores de iOS, entonces en ese caso ¿cómo voy a hacer que el objeto 'inseguro__unretain' sea más seguro, lo cual no está configurado a 'nil' automáticamente? –

4

Strong le dice a ARC que conserve la propiedad.

@property (strong,nonatomic) NSObject *object; 
@property (retain,nonatomic) NSObject *object; 

Débil es asignar esencialmente, una propiedad no retenida. Excepto cuando el objeto es desasignado, el puntero débil se establece automáticamente en cero.

@property (weak,nonatomic) NSObject *object; 
@property (assign,nonatomic) NSObject *object; 

Weak solo está disponible para iOS 4.3 y posteriores. Si desea apuntar a iOS 4.2, necesita utilizar unsafe_unretained, que funcionará exactamente como lo hace con la asignación.

+0

En Mac OS X, 'weak' solo está disponible desde Lion; tu consejo de iOS 4.2 es para Snow Leopard también. –

+0

@NJones, aunque tengo una pregunta. ¿Cómo diablos puede 'débil' ser' no atómico'? 'weak' * por definición * es' atomic'. –

+0

@JacobRelkin. Buena pregunta. Asumiría que el modificador débil desmiente lo no atómico.Pero así es como se hace; Solo para comprobar que comencé un nuevo proyecto de Xcode, agregué una etiqueta, y luego conecté una toma de corriente lo suficiente que me dio la etiqueta @property (débil, no atómica) IBOutlet UILabel *; – NJones

1

Los calificadores de tipo son __autoreleasing, __strong, __unsafe_unretained y __weak. Los modificadores de propiedad son strong, unsafe_unretained y weak.

Eche un vistazo a section 4 of Automatic Reference Counting en la documentación de LLVM/Clang.

Cuestiones relacionadas