ultima tutorial objective logo objective-c

objective-c - tutorial - objective c vs swift



¿Por qué usar el puntero débil para la delegación? (4)

Aunque los ciclos de retención son una preocupación válida, el razonamiento para una referencia débil está más relacionado con la perspectiva de apple sobre cómo usar el patrón de delegación con uikit y otros elementos de la caja que se explica aquí:

http://developer.apple.com/library/IOs/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html

Específicamente: "El principal valor de la delegación es que te permite personalizar fácilmente el comportamiento de varios objetos en un objeto central".

Si el delegado se ocupa de la administración de las tareas delegadas de varios objetos, esos objetos no necesitan retener al delegado y no deben asumir la responsabilidad de desasignar el delegado, ya que podría ser utilizado por otros objetos. La referencia débil refuerza el concepto de que la gestión del delegado no es responsabilidad del delegador.

Un ejemplo en el objetivo c es un delegado que se usa para múltiples vistas de tabla, como cuando se usa una vista de tabla y un controlador de pantalla de búsqueda con uisearchbar. Los ejemplos de las manzanas usan el controlador como delegado, pero el razonamiento aún se cumple cuando se usa un delegado personalizado tanto para la vista de tabla principal como para la vista de tabla de resultados para su búsqueda. Es probable que su controlador retenga ese delegado personalizado para que se le proporcione a ambas vistas de tabla.

Esto es fundamentalmente diferente del patrón de delegación básico al que se hace referencia en otros idiomas, donde el delegado a menudo es creado por el delegador y cada instancia puede administrar su propia instancia de delegado.

No puedo entender por qué es correcto definir un delegado con un puntero débil:

@property (nonatomic,weak) id delegate;

No me doy cuenta por qué no es necesario retener una referencia al delegado ... no quiero desasignar el objeto que uso como delegado ... por lo tanto, preferiría usar una referencia fuerte no una ¡débiles!

En muchos casos, el delegado es el mismo objeto donde se creará la instancia de mi clase, en este caso crear una referencia débil sería una gran solución para evitar retener el ciclo ... pero ¿qué sucede si elijo un objeto totalmente diferente como delegado? ?

Busqué otras preguntas sobre el desbordamiento de la pila, pero no puedo encontrar algo que pueda ayudarme a comprender completamente esta situación.


Como práctica común, si tenemos dos objetos que tienen referencias entre sí, hacemos que el objeto "hijo" en una relación "padres-hijos" sea una referencia débil.
Para los patrones de delegación en iOS, el objeto delegado es el padre, porque no es necesario que el llamador delegado exista sin el objeto delegado. Por ejemplo, tiene un objeto de oración con un objeto delegado para el método sentenceShouldEnd. Su objeto de párrafo es el objeto delegado para su objeto de oración. Obviamente, el objeto de párrafo es en realidad el padre, y en su objeto de oración debe mantener a su delegado como una referencia débil.
A su punto, usted asigna al delegado a sí mismo, su comprensión es incorrecta. Nunca deberíamos asignar un delegado a sí mismo. ¿Por qué compra usted mismo su boleto si siente que es necesario contratar a un agente para comprar el boleto por usted? Estás diciendo dos conceptos completamente diferentes. Cuando define un objeto delegado como propiedad, se utiliza una referencia débil en el objeto en el que está definido (digamos A, es decir, el objeto delegado es una propiedad de A). El delegado se asigna cuando inicias A (digamos en B), entonces lo más probable es que le asignes a A.delegate a ti mismo, lo cual es en realidad B. ¿Ves aquí la relación padre-hijo? Usted asigna memoria para A en B. Mantiene A en B. A no existe sin B. ¡No está asignando el delegado a A !!!!


Esto es para evitar retener los ciclos. Apple ofrece una guía informativa sobre la gestión avanzada de la memoria que explica la situación y la mejor forma de lidiar con ella. En ARC, ahora se conocen como fuertes ciclos de referencia, que se explican en las Notas de la versión de transición a ARC .

Anteriormente definiría una propiedad para un delegado como este,

@property (nonatomic, assign) id delegate;

Pero en ARC, puedes definirlo así,

@property (nonatomic, unsafe_unretained) id delegate;

O, por ejemplo, si tiene un protocolo llamado <MyObjectDelegate> , también puede definir el delegado de esta manera,

@property (nonatomic, weak) id <MyObjectDelegate> delegate;

En otras palabras, en ARC si tiene un protocolo, puede declarar que un delegado es weak . De lo contrario, unsafe_unretained .


La razón por la que los objetos retienen débilmente a sus delegados es evitar ciclos de retención. Imagine el siguiente escenario: el objeto a crea b y lo conserva, luego se establece como delegado de b . a es liberado por su propietario, dejando un ciclo de retención que contiene a y b . Este es en realidad un escenario muy común. Considere un controlador de vista que posee una vista y actúa como delegado de esa vista. En este caso, la vista no debe retener el controlador, como una característica de la arquitectura MVC adecuada y para evitar ciclos de retención.