Estoy tratando de averiguar cuál es la práctica recomendada para la siguiente situación. Ciertos objetos, como CLLocationManager o MKReverseGeocoder, envían sus resultados de forma asíncrona a un método de devolución de llamada delegado. ¿Está bien liberar esa instancia CLLocationManager o MKReverseGeocoder (o la clase que sea) en el método de devolución de llamada? El punto es que ya no necesita ese objeto, por lo que le pide que deje de enviar actualizaciones, establezca su delegado en cero y libere el objeto.Liberación de un objeto delegado en su método de devolución de delegado
pseudo código:
@interface SomeClass <CLLocationManagerDelegate>
...
@end
@implementation SomeClass
...
- (void)someMethod
{
CLLocationManager* locManager = [[CLLocationManager alloc] init];
locManager.delegate = self;
[locManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Do something with the location
// ...
[manager stopUpdatingLocation];
manager.delegate = nil;
[manager release];
}
@end
Me pregunto si este patrón de uso se considera que es siempre bien, si se considera que nunca está bien, o si depende de la clase de?
Hay un caso obvio en el que liberar el objeto de delegación salía mal y eso es si tiene que hacer algo después de haber notificado al delegado. Si el delegado libera el objeto, su memoria puede sobrescribirse y la aplicación falla. (Eso parece ser lo que ocurre en mi aplicación con CLLocationManager en una circunstancia particular, ambos solo en el simulador. Estoy tratando de averiguar si es un error del simulador o si lo que estoy haciendo es fundamentalmente defectuoso)
He estado buscando y no puedo encontrar una respuesta definitiva a esto. ¿Alguien tiene una fuente autorizada que pueda responder esta pregunta?
Si ve un bloqueo - la otra cosa que podría * intentar * sería establecerlo en * liberación automática * en lugar de soltarlo explícitamente. Sin embargo, al no saber de manera concluyente, esto podría estar ofuscando el problema, en lugar de solucionarlo de verdad ... – Brad
Interesante, no lo había considerado. Sin embargo, me pregunto qué grupo de autorrelease tomará esto en cuenta. – Hollance
No estoy seguro, pero de alguna manera hacer esto se siente mal. –