El conteo automático de referencias (ARC) introduce algunos calificadores de tipos nuevos. He visto __strong
y __weak
, pero ¿qué hacen?¿Cuáles son los nuevos calificadores de tipo introducidos con ARC?
Respuesta
__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.
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.
En Mac OS X, 'weak' solo está disponible desde Lion; tu consejo de iOS 4.2 es para Snow Leopard también. –
@NJones, aunque tengo una pregunta. ¿Cómo diablos puede 'débil' ser' no atómico'? 'weak' * por definición * es' atomic'. –
@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
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.
- 1. ¿Cuáles son los nuevos marcos?
- 2. ¿ARC o no a ARC? ¿Cuáles son los pros y los contras?
- 3. Nuevos atributos de propiedades ARC
- 4. ¿Cuáles son los límites de la inferencia de tipo?
- 5. ¿Cuáles son los nombres de los nuevos registros de procesadores X86_64?
- 6. Descarta los calificadores de error
- 7. ¿Los comparadores son objetos nuevos o inyectables?
- 8. ¿Cuáles son los verdaderos beneficios de ExpandoObject?
- 9. ¿Cuáles son los mejores trucos de depuración con Weld/CDI?
- 10. ¿Cuáles son los peligros de usar sql_variant?
- 11. ¿Cuáles son los usos de svn copy?
- 12. ¿Cuáles son los otros valores de NaN?
- 13. ¿Cuáles son los beneficios de JCA?
- 14. ¿Cuáles son los buenos usos de los módulos empaquetados OCaml?
- 15. ¿Cuáles son los beneficios de usar WCF?
- 16. ¿Cuáles son los mayores beneficios de LLVM?
- 17. ¿Cuáles son los beneficios de JRebel?
- 18. ¿Cuáles son los beneficios de letrec?
- 19. ¿Cuáles son los méritos relativos de pdflatex?
- 20. ¿Cuáles son los problemas del mundo real con Ruby?
- 21. ¿Cuáles son los inconvenientes de usar Lucene?
- 22. ¿Cuáles son los límites de TDD?
- 23. ¿Cuáles son los inconvenientes de Stackless Python?
- 24. ¿Cuáles son los pros/contra de usar bigote con Backbone.js?
- 25. ¿Deberían usarse los calificadores de tipo inútil en los tipos de devolución, para mayor claridad?
- 26. ¿Cuáles son los usos de buffer circular?
- 27. ¿Cuáles son los mejores componentes de Boost?
- 28. ¿Cuáles son los beneficios de Persistence Ignorance?
- 29. ¿Cuáles son los repositorios predeterminados de leiningen?
- 30. ¿Cuáles son los comandos importantes de Ruby?
¿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? –
@MohammadAbdurraafay Puede usar '__weak' en ese caso ... –
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? –