2010-12-15 20 views
6

¿Cuándo se debe usar retain? Entiendo que aumenta el recuento de referencias de objeto, por lo que básicamente el siguiente release en ese objeto no llamará al dealloc. Muy bien, ¿y qué? Leí que es una especie de convención, que si te importa un objeto, lo puedes retain. ¿Hay algún ejemplo de eso por ahí? ¿Es eso verdad?¿Entender cuándo llamar retener en un objeto?

EDIT:

yo no estoy buscando cuando el depurador te dice que hagas esto o aquello. Entonces, miré en this.

Para ponerlo en mis palabras, he aquí un ejemplo de un uso retain

  • en su código, se invoca en alguna parte un método un método que devuelve un objeto que usted no posee
  • se trabaja con ese objeto
  • entonces usted quiere liberarlo =>no se puede porque usted no es el propietario
  • su solución es para cualquiera que use copy o retain. Si usa el usuario retain, obtendrá la propiedad de ese objeto.
  • a continuación para liberar ese objeto, o bien realizar release 2 (ya que el recuento ref es 1 + 1 cuando usted conserva) o utilizar directamente en él dealloc

es que? No lo creo porque un objeto puede tener múltiples propietarios. Entonces, para el último punto, llamar al dealloc realmente "matará" al objeto; pero con 2 release, no serás propietario, pero el programa que lo creó seguirá siendo, por lo tanto, los objetos están aún vivos en algún lugar (¿fuga? zombie?)

Por favor, estoy confundido.

+0

posible duplicado de [Administración de memoria en Objective-C] (http://stackoverflow.com/questions/106627/memory-management-in-objective-c) – Abizern

+0

No veo la necesidad de un voto negativo sobre este . upvoted – Bourne

+0

Estoy tan confundido con retener. Simplemente no entiendo por qué uno lo usaría. Intenté expresar cómo lo usaría en la edición que acabo de hacer ... –

Respuesta

6

Todas sus respuestas se encuentran en el Memory Management Guide.

EDITAR

Después de su edición, aquí está el detalle un poco más específico:

en el código, en algún lugar de invocar un método de un método que devuelve un objeto que no es propietario

Como no es su propietario, no tiene control sobre su vida útil. Podría liberarse mientras aún confías en que sea un objeto válido.

se trabaja con ese objeto

Nunca seguro de que va a existir.

entonces usted quiere liberarlo => no se puede porque no es el propietario

Pero ¿por qué quieres para liberarlo? No posee el objeto por lo que no es responsable de su gestión de memoria.

Parece que quiere llamar al release porque cree que así es como administra la memoria, y que el retain es como lo llama.

Aquí es la forma en que debería funcionar:

  • se invoca un método que devuelve un objeto. Si no ha recibido este objeto, puede llamar al alloc, new, copy o mutableCopy y, como corresponde al Memory Management Guide, no es el propietario del objeto, por lo que no es responsable de administrar esta memoria.
  • En la mayoría de los casos, puede suponer que se le ha pasado un objeto liberado automáticamente. Eso significa que no tienes control sobre su vida. Para asegurarse de que no se libere antes de que haya terminado con él, llame al retain en el objeto. Ahora posee este objeto y es responsable de llamar al release en algún momento en el futuro. Es un error de un principiante preocuparse ahora por el conteo retenido del objeto. No seas. Lo único que importa es que usted es responsable de llamar al release.
  • Utiliza el objeto teniendo en cuenta el paradigma general de gestión de memoria. Por ejemplo, si agrega este objeto a un NSArray, la matriz lo conservará.
  • Una vez que haya hecho lo que necesita hacer con el objeto, llame al release en él. De nuevo. No se preocupe por el recuento de retención del objeto ni por otros objetos que estén usando este objeto. Lo único que importa es que haya equilibrado sus llamadas al retain con un número igual de llamadas al release.
+1

Excelente @Abizen. Todo lo que necesitaba –

-1

Comprobar la Objective-C beginners guide para uso básico

+0

Sé lo que retiene. Lo que no sé es cuándo usarlo correctamente. El enlace que proporcionó no explica ninguno. –

1

Normalmente yo sólo uso retener de forma explícita cuando hay una necesidad de y el depurador de Xcode me dice lo que acaba de ocurrir cuando surge una situación de este tipo. Por lo general, por la razón que sea (mala gestión por parte del desarrollador o si se produce alguna versión detrás de las escenas), usted hace cualquier cosa en un objeto liberado, se produce un bloqueo. Simplemente lea el registro en la consola, vea el depurador en Xcode cuando depure y adivine generalmente qué objeto está causando el problema.

0

Marcel, la gestión de memoria es un punto crucial en el desarrollo de aplicaciones de iOS. Debería considerar leer la documentación de Apple al respecto, como lo sugirieron los otros muchachos.

Puedo agregar aquí alguna información para tratar de ayudarlo con sus necesidades.

El proceso de gestión de la memoria con Obj-C es la base de recuento. Significa que cada vez que "retiene" algún objeto, el sistema mejora un contador para este objeto. Por ejemplo, si crea un botón y lo "retiene", tendrá un valor 1. Si lo retiene nuevamente, tendrá un valor 2. Para destruir este objeto por completo, deberá liberarlo dos veces. Cada vez que un objeto tiene un valor 0, se destruirá.

Mi opinión personal: si quiere tener un buen control sobre la administración de la memoria de su aplicación, es bueno retener y destruir sus objetos explícitamente, evitando la liberación automática cuando sea posible. Nuevamente, es mi opinión personal. Me gusta estar al tanto del proceso de memoria dentro de mis aplicaciones, por eso prefiero ocuparme de esto con precisión.

Claro que no es la MEJOR manera, cada desarrollador preferirá utilizar un enfoque diferente para administrar la memoria.

De nuevo: tómese un tiempo para leer la documentación que Abizem le sugirió. Seguro que lo entenderá mejor.

+0

Gracias Trinca. Parece que retener tiene que ser usado de la misma manera que css z-index ... quieres mantener tu elemento al frente para que pongas un gran valor. ¿Es lo mismo para retener? Quieres que tu objeto esté absolutamente vivo (¿por qué? ¡No!) Así que lo retienes una o dos veces ... ?? –

+2

@Marcel ¡No! Definitivamente no. Conserva un objeto cuando desea mantenerlo fuera del alcance actual y libera un objeto del que se ha apropiado. Nunca retienes varias veces solo para estar seguro. – kubi

+0

@kubi - ¡Explicado perfectamente! – Trinca

Cuestiones relacionadas