我正在开发一款iPad照片拼贴应用,它可以同时在屏幕上绘制数百张UIImageView
。
有一个按钮可以让用户“重新创建”,这个按钮假定在所有照片上运行一个for
循环来[photo removeFromSuperview]
,然后按照这个顺序初始化一个新的批次。
我正在使用ARC,我的控制台告诉我,我的Photo
的dealloc
方法直到下一批被绘制之后才会被调用,这意味着我遇到了内存问题,即使我试图在添加下一组之前删除第一组。
有没有办法1)等到所有的照片都被正确地解除分配,或者2)强制所有的照片在ARC下立即解除分配?
发布于 2012-10-10 21:18:57
您可能将您的图像视图放在一个自动释放池中,而没有意识到这一点。您可以通过在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
期间都没有被释放。相反,当run循环调用-[NSAutoreleasePool release]
时,它会被释放。
然后我更改了destroyImageView
来管理它自己的自动释放池:
- (void)destroyImageView {
@autoreleasepool {
for (UIView *subview in self.view.subviews) {
if ([subview isKindOfClass:[UIImageView class]]) {
[subview removeFromSuperview];
}
}
}
}
当我在Instruments下再次运行它时,我看到在@autoreleasepool
块末尾的destroyImageView
期间,每个删除的图像视图都被释放了。
发布于 2012-10-10 19:57:32
ARC dealloc
s任何不再有强引用的对象。因此,要对某个对象执行dealloc
操作,只需将指向它的所有变量设置为nil
,并确保该对象不涉及任何循环引用。
https://stackoverflow.com/questions/12827319
复制