2011-09-05 10 views
14

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

16

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).

+0

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

+1

Sí. Pero tenga en cuenta que los métodos como "alloc" incluyen un "retener" implícito. – Thilo

+0

@Thillo Si estamos usando propiedades, ¿'débil 'es lo mismo que' asignar'? –

6

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.

+1

¿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

+0

¿Puede explicarme por favor una referencia fuerte? – Hitesh

+0

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

Cuestiones relacionadas