Estoy tratando de aprender el conteo automático de referencias en iOS 5. Ahora, la primera parte de esta pregunta debería ser fácil:
¿Es correcto que NO necesito escribir declaraciones explícitas de propiedad de lanzamiento en mi dealloc cuando uso ARC? En otras palabras, ¿es cierto que lo siguiente NO necesita un acuerdo explícito?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
Mi siguiente y más importante pregunta proviene de una línea en el documento Notas de la versión de transición a ARC :
No es necesario (de hecho no puede) liberar variables de instancia, pero es posible que deba invocar [self setDelegate: nil] en las clases del sistema y otro código que no se compila utilizando ARC.
Esto plantea la pregunta: ¿cómo sé qué clases de sistema no están compiladas con ARC? ¿Cuándo debería crear mi propio Dealloc y establecer explícitamente propiedades de retención fuerte en cero? ¿Debo suponer que todas las clases de marco NS y UI utilizadas en las propiedades requieren deallocs explícitos?
Existe una gran cantidad de información sobre SO y en otros lugares sobre las prácticas de liberar el ivar de respaldo de una propiedad cuando se usa el seguimiento de referencia manual, pero relativamente poco acerca de esto cuando se usa ARC.
fuente
MyController : UIViewController
clase que crea y posee una UIView y también establece el delegado de la vista en sí mismo. Es el único propietario que retiene esa vista. Cuando el controlador se desasigna, la vista también debe desasignarse. ¿Importa entonces si el puntero delegado está colgando?UIWebView
, los documentos declaran explícitamente que necesita anular el delegado.unsafe_unretained
es exactamente equivalente a unaassign
propiedad y es el comportamiento normal para las relaciones de delegado bajo MRR, y estos deben ser anulados.Solo para dar la respuesta opuesta ...
Respuesta corta : no, no tiene que anular las propiedades auto-sintetizadas en
dealloc
ARC. Y no tienes que usar el setter para los que están adentroinit
.Respuesta larga : debe anular las propiedades sintetizadas personalizadas en
dealloc
, incluso bajo ARC. Y deberías usar el setter para aquellos eninit
.El punto es que sus propiedades sintetizadas personalizadas deben ser seguras y simétricas con respecto a la anulación.
Un posible setter para un temporizador:
Un posible configurador para una vista de desplazamiento, vista de tabla, vista web, campo de texto, ...:
Un setter posible para una propiedad KVO:
Entonces usted no tiene que duplicar ningún código para
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... y su propiedad de manera segura puede hacerse pública. Si estaba preocupado por las propiedades nulasdealloc
, entonces podría ser el momento de verificar nuevamente sus setters.fuente