¿Cuáles son las desventajas de establecer todas las properties fuertes?

Como nuevo progtwigdor de iOS, he tenido una gran cantidad de errores para corregir hoy, algunos de ellos se han relacionado con mí usando properties débiles en lugar de fuertes.

Me doy count de que un buen progtwigdor no tendría este problema y solo establecería las properties fuertes que deben ser, pero, sin embargo, en mis ojos novatos, no veo por qué debo usar débil, solo agrega el riesgo de problemas.

En general, debe decidir entre weak , strong , assign y copy mirando la relación entre la class que posee la propiedad y el valor de esa propiedad, y también el tipo de propiedad que se pasa.

  • Si la propiedad que se establece es primitiva, use assign (o no utilice el calificador de propiedad en absoluto)
  • Si la propiedad que se establece es un object escalar, inmutable, use strong
  • Si la propiedad que se establece es un object escalar, mutable que implementa el protocolo NSCopying , use una copy
  • Si la propiedad que se establece es mutable y la propiedad se transfiere a su object, utilice strong
  • Si la propiedad que se establece es un object mutable que implementa el protocolo NSCopying , pero la propiedad se mantiene con la persona que llama, use una copy
  • Si la propiedad que se establece es una reference posterior (es decir, una propiedad "para padres" en un object "secundario"), use weak .

El concepto de propiedad es muy importante en los models de memory contados de reference. Este es el principal factor impulsor de su decisión. Debe decidir dónde es el propietario principal de un object y darle a ese propietario una reference sólida. Si se comparte una propiedad entre un grupo de objects, dales una reference sólida.

La situación más difícil es cuando los objects pueden poseerse entre sí, directa o indirectamente. En este caso, sería mejor replace "propiedad" con "sabe", dar a todos los objects un propietario común "superior" que "posee" a todos, y modelar las relaciones de "sabe" con references weak .

weak y strong son muy importantes para ser correctos con fines de administración de la memory.

strong boostá el contador de references para el puntero, y usted efectivamente dice que es el propietario del object.

weak no aumenta el contador de reference, y el object puede desaparecer en cualquier momento. Si tiene una dependencia cíclica, debe usar weak para evitar una pérdida de memory (dos objects que tienen una fuerte reference entre ellos son una dependencia cíclica y esos objects nunca se liberarán).

Siempre debe pensar en su event handling la memory, pero una buena regla es que la propiedad siempre debe ser strong , a less que sepa positivamente que se retiene en otra parte. Varios objects pueden tener una strong reference al mismo object sin problemas, siempre que no se produzcan references cíclicas.

Algunas reglas básicas súper básicas:

Si quieres que el object se quede al less hasta que hayas terminado con él, ve con fuertes

Si puedes manejar el object desapareciendo sin que te haga daño demasiado (es decir, es el padre que te creó lo que podría ser bueno saber pero no es muy importante), usa débil

si no es un NSObject (por lo que es un int, bool float u otro tipo primitivo) use asignar .

Una regla empírica que uso es: si el object se retiene en otro lugar, use débil. Lo más importante para mí es usar el generador de interfaces. Si tiene un IBOutlet , puede hacerlo débil, porque ese object se ocupa en el generador de interfaces y en el file XIB