Wikipedia dice "En la programación informática, una referencia débil es una referencia que no protege el objeto al que se hace referencia de la recopilación por un recolector de basura". ¿Cómo se ven esos dos tipos de referencias en el código? ¿Una referencia débil es una referencia hecha por un mensaje liberado automáticamente?¿Cómo se ven las referencias débiles y fuertes en Objective-C?
Respuesta
La respuesta siguiente es para el caso cuando no hay recolección de basura (como en iOS). En el caso de la recolección de basura, en realidad hay una palabra clave (__weak
) para crear una referencia débil.
Una referencia "débil" es una referencia que no conserva.
Debe utilizar estas referencias débiles para romper los ciclos. Un caso común es un objeto secundario que necesita una referencia a su objeto principal. En este escenario, el padre retendría una referencia al objeto hijo, y el objeto hijo tiene una referencia a su elemento primario, pero no lo retiene. Esto funciona porque el objeto hijo solo necesita existir mientras el objeto padre lo haga.
¿Una referencia débil es una referencia hecha por un mensaje de autorrelleno?
En realidad no, eso sería una "referencia muy débil" ;-)
cosas lanzado Auto-desaparece cuando la pila de llamadas se desenrolla (al final de cada ciclo de eventos, por ejemplo). Si necesita que algo sea menos temporal, debe conservar una referencia (o, como en el caso anterior, asegúrese de que otra parte lo conserve lo suficiente).
Una referencia débil es una referencia que no es lo suficientemente fuerte como para forzar a un objeto a permanecer en la memoria mientras que una referencia fuerte obliga a un objeto a permanecer en la memoria.
Si ha creado una referencia débil a cualquier variable, puede obtener nada de eso.
UITableViewDelegate
, UIScrollViewDelegate
, etc. son ejemplos de referencias débiles.
Ejemplo de referencia Fuerte:
MyClass *obj1 = [[Myclass alloc] init];
Myclass *obj2 = obj1;
Aquí obj2
tiene una fuerte referencia a obj1
decir si se quita de la memoria obj2
continuación obj1
también se eliminan.
¿Obj2 realmente tiene una fuerte referencia a obj1? Usted declara "Una referencia débil es una referencia que no es lo suficientemente fuerte como para obligar a un objeto a permanecer en la memoria", y mirando su ejemplo, enviar un mensaje de liberación a obj1 no evitaría que el obj1 se retenga en la memoria porque " Myclass * obj2 = obj1; " la asignación no aumenta el conteo retenido en obj1. En mi humilde opinión es una referencia débil. – Centurion
¿Puede explicarme por favor una referencia fuerte? – Hitesh
Creo que una segunda declaración "[obj2 retener];" lo haría una referencia fuerte. Sí, obj2 es solo un puntero a obj1 y ambos 2 retengan recuentos pertenecen al mismo objeto asignado en la memoria y en mi humilde opinión almacenado en un lugar en alguna parte.Pero cada recuento de retención +1 tiene un propietario (al menos teórico) y para mí es mejor pensar en ese propietario como var/ivar/property que se utilizó para enviar un mensaje explícito (retener) o implícito (alloc) retener en el destino objeto. – Centurion
- 1. ¿Cómo se implementan las referencias débiles?
- 2. iOS ARC - propiedades débiles y fuertes
- 3. Referencias débiles en python
- 4. referencias débiles y objetos desechables
- 5. Propiedades débiles y fuertes en -viewDidUnload bajo ARC
- 6. referencias débiles en bloques y ciclos retener
- 7. ¿Cuándo se deben usar referencias débiles?
- 8. Otros usos de referencias débiles?
- 9. Java: pila con referencias débiles
- 10. Reducción a cero de las referencias débiles en ARC
- 11. Costo de usar referencias débiles en Java
- 12. ¿Los oyentes anónimos son incompatibles con las referencias débiles?
- 13. Cuándo usar referencias débiles en Python?
- 14. Recopilador de basura al analizar referencias débiles
- 15. ¿Cómo se usan las matrices débiles?
- 16. ¿Cómo reemplazo las referencias débiles cuando uso ARC y apunte a iOS 4.0?
- 17. Beneficios de referencia débiles
- 18. ¿Cuándo se lanzan las propiedades fuertes en ARC en iOS?
- 19. Diseñar y parámetros fuertes
- 20. ¿Costo para GC de usar referencias débiles en C#?
- 21. ¿Qué clases de iOS no admiten referencias débiles?
- 22. ¿Cuáles son las referencias mundiales débiles? ¿Cómo es diferente de una referencia global?
- 23. punteros compartidos, débiles y flojos en C++
- 24. ¿Cómo se ven los símbolos de depuración?
- 25. ¿Las aplicaciones Qt se ven y se sienten nativas en Windows?
- 26. duración de las variables locales débiles con ARC
- 27. WeakReference no se devuelve un valor nulo, aunque no hay fuertes referencias al objeto real de referencia
- 28. ¿Cómo funcionan los eventos débiles?
- 29. Cuándo usar referencias fantasma en Java?
- 30. Los colores se ven diferentes en el navegador y photoshop
Lo que más me preocupa es el SDK de iOS. Respecto a iOS 4: entonces, ¿todas las propiedades de "asignar tipo" y cualquier otra asignación simple de un puntero obj a otro sin mensaje de retención explícito deben considerarse como referencias débiles? – Centurion
Sí. Pero tenga en cuenta que los métodos como "alloc" incluyen un "retener" implícito. – Thilo
@Thillo Si estamos usando propiedades, ¿'débil 'es lo mismo que' asignar'? –