Probablemente esté poniendo sus vistas de imagen en un grupo de liberación automática sin darse cuenta. Es posible que pueda solucionar esto al incluir su propio grupo de autorreleases en su ciclo for-loop.
Por ejemplo, hice un proyecto de prueba muy simple con una vista de imagen y un botón debajo de mi vista de nivel superior. Cuando toco el botón, elimina la vista de la imagen y crea una nueva. Elimina la vista de la imagen al recorrer las subvistas de la vista de nivel superior. Aquí está el código:
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initImageView];
}
- (IBAction)redoWasTapped:(id)sender {
[self destroyImageView];
[self initImageView];
}
- (void)destroyImageView {
for (UIView *subview in self.view.subviews) {
if ([subview isKindOfClass:[UIImageView class]]) {
[subview removeFromSuperview];
}
}
}
- (void)initImageView {
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picture.jpg"]];
imageView.frame = CGRectInset(self.view.bounds, 100, 100);
[self.view addSubview:imageView];
}
@end
Cuando me encontré con esto bajo el instrumento Asignaciones con “los recuentos de referencia Record” habilitadas, vi que cada vista de la imagen eliminada no se cancela la asignación durante destroyImageView
. En cambio, fue desasignado más tarde cuando el ciclo de ejecución llamó al -[NSAutoreleasePool release]
.
Entonces cambió destroyImageView
para gestionar su propia piscina autorelease:
- (void)destroyImageView {
@autoreleasepool {
for (UIView *subview in self.view.subviews) {
if ([subview isKindOfClass:[UIImageView class]]) {
[subview removeFromSuperview];
}
}
}
}
Cuando me encontré de nuevo en virtud de instrumentos, vi que cada vista de la imagen eliminada se cancela la asignación durante destroyImageView
, al final del bloque de @autoreleasepool
.
Radu tiene razón en que una vez que elimine las vistas de las imágenes y quite todas las referencias sólidas a ellas, se desasignarán inmediatamente. No es como el viejo problema de MRC donde el uso descuidado de 'autorelease' podría resultar en un aplazamiento de la liberación de la memoria hasta el final del ciclo de ejecución actual. Si sigues teniendo problemas, probablemente necesites mostrarnos un fragmento de código sobre cómo crear, agregar y guardar referencias a las imágenes y sus vistas de imágenes. Pero si elimino la vista de imagen y creo una nueva, el trato para la anterior sucede antes de que llegue la creación de la nueva. – Rob