Acabo de leer sobre cómo fallar correctamente en un método init y los documentos parecen estar en desacuerdo entre sí. Uno recomienda lanzar una excepción mientras que los otros recomiendan limpiar y devolver cero. ¿Cuál es la mejor práctica actual aquí?[self release], [self dealloc] o [super dealloc] en los métodos init?
Respuesta
Creo que la práctica generalmente aceptada es devolver nulo al fallo. Pero usted desea liberar auto para evitar una fuga: la filosofía
-(id)init
{
if (self = [super init]) {
...
if (thingsWentWrong) {
[self release];
return nil;
}
...
}
return self;
}
El método que siempre he utilizado es limpiar y devolver nil. Los tres métodos que menciona en el título de su pregunta pueden ocasionar que los segmentos superiores suban en la jerarquía de llamadas, mientras que los valores nulos no lo harán. Creo que los documentos de Apple dicen que devuelvan nulo en caso de falla. ¿Dónde encuentras discrepancias?
Simplemente devolviendo nil perderá memoria, ya que la llamada a alloc habrá creado un objeto con un conteo de retención de uno. –
La fuga de memoria es lo que quiero evitar. – Kevin
Los enlaces a documentos: Detección error durante la inicialización - http://tr.im/mlyA implementación de un inicializador - http://tr.im/mlyX Se dará cuenta de que bajo el código de ejemplo en el segundo link recomiendan lanzar una excepción en su lugar. Estoy bastante seguro de que esa no es la mejor práctica actual. – Kevin
de cacao sobre las excepciones es que sólo se deben lanzar en situaciones que son programador errores, como pasar un argumento ilegal a un método. Si algo más sale mal, el método debería simplemente devolver NO o nulo, y con suerte informar los detalles a través de un parámetro NSError ** "out".
Esto incluye -init methods. Si la situación de error es algo que podría ocurrir legítimamente en el producto terminado, entonces el método debería liberarse (para evitar una fuga) y devolver cero.
Después de haber cubierto las soluciones correctas (excepciones y/o [self release]; return nil;
), abordaré las soluciones incorrectas.
No envíe dealloc
directamente. Ese es el trabajo de release
. (Y si el código se ejecuta en vez de GC, dealloc
no es aplicable, y sólo podía especular sobre cuáles son los problemas que causaría llamando.)
Doble-no uso super
para enviar directamente. Eso saltaría su propia implementación dealloc
.
- 1. Release, Dealloc y Self Reference
- 2. iPhone SDK: Dealloc vs. Release?
- 3. ¿Por qué en Objective-C usamos self = [super init] en lugar de solo [super init]?
- 4. dealloc, ¿usar lanzamiento o establecer en cero para las propiedades?
- 5. clase, dict, self, init, args?
- 6. Volviendo 'self' mientras no está configurado para el resultado de '[(super o self) init ...]' cuando inicializo la celda personalizada
- 7. Obj-, la variable de instancia utilizada mientras 'self' no está configurada para el resultado de '[(super o self) init ...]'
- 8. python y usar 'self' en los métodos
- 9. ¿Por qué "[self class] == [super class]"?
- 10. Python: super y __init __() vs __init __ (self)
- 11. ¿Cuál es el equivalente Monotouch de dealloc?
- 12. "Falta [super dealloc]" advertencia en un proyecto de ARC
- 13. Problema invalidar NSTimer en dealloc
- 14. ¿Cuáles son las diferencias entre free, dealloc, release y autorelease?
- 15. ¿Por qué no super (Thread, self) .__ init __() trabaja para una subclase threading.Thread?
- 16. if (self = [super init]) - ¡Advertencia de LLVM! ¿Cómo estás lidiando con eso?
- 17. ¿Qué significa [self self] en el objetivo c?
- 18. Suelte en viewDidUnload and dealloc both?
- 19. Seguimiento viewDidUnload vs dealloc pregunta
- 20. ¿Es malo sincronizar NSUserDefaults en - (void) dealloc?
- 21. ¿Qué es dealloc en el objetivo C
- 22. removeObserver: forKeyPath: in dealloc
- 23. ¿Es malo enviar un mensaje a self() in init?
- 24. diferencia entre la liberación y dealloc en Objective-C
- 25. ¿Cómo se selecciona child-or-self (niños + self)
- 26. UIViewController & UIview dealloc no se llama
- 27. var self = esto?
- 28. ¿Qué significa "Self" y "# Self" en el instrumento Time Profiler?
- 29. ¿Cuándo usas 'self' en Python?
- 30. Cómo eliminar la memoria caché de UIWebview o dealloc UIWebview
Gracias por los comentarios chicos. Esto es lo que estaba haciendo y pensé que era el enfoque adecuado, pero las referencias a los otros dos métodos en los documentos me hicieron pensar que podría haber algunos casos especiales de los que se tenga conocimiento. – Kevin