0

メモリ警告が表示されると、次のエラーが表示されます。

*** -[TheViewController_iPhone productImages]: message sent to deallocated instance

Xcode は、以下の行にエラーがあることを示しています。

- (void)viewDidUnload
{
    [super viewDidUnload];

    [self.productTimer invalidate];
    //self.productTimer = nil;

    for(UIView *subview in [self.productImages subviews]) { //THIS LINE IS THE ERROR
        [subview removeFromSuperview];
    }
}

私の質問は、この時点で productImages (scrollView である) の割り当てが解除されるのはなぜですか? サブビューをダンプする機会を得るべきではありませんか?

次のように定義されます。

@property (weak, nonatomic) IBOutlet UIScrollView *productImages;
4

1 に答える 1

0

viewDidUnloadビュー コントローラーのビューは、呼び出されたときに既にアンロードされています。これは、ビューのサブビューがビューによって保持されなくなることを意味します。productImagesこれはView Controllerのビューのサブビューだと思います。その場合、ビューがアンロードされた後も引き続き使用できるようにする場合は、代わりにproductImagesasを宣言する必要があります。strongweak

もう 1 つの注意点は、 でタイマーをviewDidLoad無効にする際に でタイマーの繰り返しを開始することは非常に悪い習慣viewDidUnloadです。viewDidAppear:とで行う方がはるかに優れていますviewWillDisappear:。詳細な説明については、このブログ投稿を参照してください http://antonholmquist.com/blog/why-you-really-shouldnt-create-repeating-nstimers-in-init-or-viewdidload/

于 2012-08-11T21:43:47.930 に答える