おそらく、画像ビューを気付かずに自動リリースプールに入れています。forループの周りに独自の自動解放プールをラップすることでこれを修正できる場合があります。
たとえば、トップレベルビューの下に1つの画像ビューと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
「レコード参照カウント」を有効にして割り当てインスツルメントでこれを実行すると、削除された各画像ビューがの間に割り当て解除されなかったことがわかりましdestroyImageView
た。代わりに、後で実行ループが。を呼び出したときに割り当てが解除され-[NSAutoreleasePool release]
ました。
次にdestroyImageView
、独自の自動解放プールを管理するように変更しました。
- (void)destroyImageView {
@autoreleasepool {
for (UIView *subview in self.view.subviews) {
if ([subview isKindOfClass:[UIImageView class]]) {
[subview removeFromSuperview];
}
}
}
}
Instrumentsで再度実行すると、ブロックdestroyImageView
の最後で、削除された各画像ビューの割り当てが解除されていることがわかりました。@autoreleasepool