ios - propiedad "asignar" y "conservar" para delegado
delegates properties (1)
La documentation dice:
Retener un objeto crea una referencia fuerte, y un objeto no puede ser desasignado hasta que se liberen todas sus referencias fuertes. Si dos objetos se retienen entre sí, ninguno de ellos se desasigna porque la conexión entre ellos no se puede interrumpir
Como ejemplo, consideremos un UITableViewController que implementa el protocolo UITableViewDelegate. UITableView es retenido por su controlador de vista, aunque el UITableView no retiene su delegado.
Como se dijo en el documento anterior, UITableViewController solo completará su desasignación cuando se liberen todas sus referencias sólidas. Dado que el UITableView que tiene el UItableViewController como delegado no lo retiene, cuando el propietario del UItableViewController llama a release, el recuento de retención se pondrá a cero y se llamará al método dealloc.
Ahora imagine que UITableView retiene su delegado. UITableViewController tendrá una cuenta de retención de al menos +2. Uno con su dueño y otro con UITableView. Cuando el propietario de UITableViewController llama a su liberación, el recuento de retención pasará a +1, y no a cero como se esperaba, y por lo tanto, el método dealloc no se llamará hasta que el recuento de retención llegue a cero. Para llegar a cero, UITableViewController necesitaría lanzar su UITableView que luego liberaría su delegado (UITableViewController). Debido a que el UITableViewController solo eliminará su vista (UITableView) cuando se desasigne, este momento nunca sucederá porque la cuenta de retención no pasará de +1.
(No tomemos en consideración las advertencias de memoria y cualquier otro caso posible ... Acabo de ver que ViewController / View no es la mejor opción para este ejemplo, pero ya he escrito demasiado. :))
¿Tiene sentido?
Para los desarrolladores de iOS, los delegados se utilizan en casi todas partes.
Y parece que necesitamos usar "asignar" en lugar de retener para un delegado como este
@property(assign) id delegate;
El motivo es evitar el problema del bucle circular ¿Por qué a los delegados de Objective-C generalmente se les asigna la propiedad en lugar de retener?
Vi un montón de código y todavía utilizaban "retener". Entonces, la pregunta aquí es: ¿seguiremos teniendo el problema del bucle circular si usamos retener para un delegado?
Gracias