您可能在没有意识到的情况下将图像视图放入自动释放池中。您可以通过将您自己的自动释放池包装在您的 for 循环周围来解决此问题。
例如,我做了一个非常简单的测试项目,在我的顶层视图下有一个图像视图和一个按钮。当我点击按钮时,它会删除图像视图并创建一个新视图。它通过遍历顶层视图的子视图来删除图像视图。这是代码:
@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
当我在启用“记录引用计数”的分配工具下运行此程序时,我看到每个删除的图像视图在destroyImageView
. 相反,它稍后在运行循环调用时被释放-[NSAutoreleasePool release]
。
然后我改为destroyImageView
管理自己的自动释放池:
- (void)destroyImageView {
@autoreleasepool {
for (UIView *subview in self.view.subviews) {
if ([subview isKindOfClass:[UIImageView class]]) {
[subview removeFromSuperview];
}
}
}
}
当我在 Instruments 下再次运行它时,我看到每个删除的图像视图都在块destroyImageView
末尾的 ,期间被释放。@autoreleasepool