Ответ 1
Вероятно, вы размещаете свои изображения в пуле автозаполнения, не осознавая этого. Возможно, вы сможете исправить это, обернув свой собственный пул автозапуска вокруг вашего цикла.
Например, я сделал очень простой тестовый проект с одним видом изображения и одной кнопкой под моим видом на верхнем уровне. Когда я нажимаю кнопку, она удаляет изображение и создает новый. Он удаляет вид изображения, перейдя по надзору просмотра верхнего уровня. Здесь код:
@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
Когда я запустил это под инструментом Allocations с включенным значением "Записи ссылок на запись", я увидел, что каждый удаленный образ не был освобожден во время destroyImageView
. Вместо этого он был освобожден позже, когда цикл выполнения называется -[NSAutoreleasePool release]
.
Затем я изменил destroyImageView
, чтобы управлять собственным пулом автозапуска:
- (void)destroyImageView {
@autoreleasepool {
for (UIView *subview in self.view.subviews) {
if ([subview isKindOfClass:[UIImageView class]]) {
[subview removeFromSuperview];
}
}
}
}
Когда я снова запустил его в разделе "Инструменты", я увидел, что каждый удаленный вид изображения был освобожден во время destroyImageView
, в конце блока @autoreleasepool
.