2

以下のコードを見てください。「戻る」ボタンをクリックするとメモリエラーが発生します。[aboutView release] を削除すると問題は解決します。なぜですか? aboutViewをどのようにリリースする必要がありますか?

-(IBAction)swichView {
    AboutView *aboutView = [[AboutView alloc] init];
    [aboutView.view setAlpha:0];
    [self.view addSubview:aboutView.view];
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDuration:1.0];  
    [aboutView.view setAlpha:1];
    [UIView commitAnimations];
    [aboutView release];
}

セカンド ビュー コントローラー:

-(IBAction)back {
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDuration:1.0];
    [self.view setAlpha:0];
    [UIView commitAnimations];
    [self.view removeFromSuperview];
}
4

3 に答える 3

0

[self.view removeFromSuperview];問題はおそらく-(IBAction)back;

あなたはそれを必要としません。ではUIViewController、そのビューは でリリースする限り処理されますdealloc

AboutView は、コントローラーのビューによって保持されます。addSubview:

このメソッドはビューを保持し、次のレスポンダーを新しいスーパービューであるレシーバーに設定します。-- ドキュメントaddSubview:

したがって、ビューが解放されると、aboutView.

于 2012-04-11T02:40:10.553 に答える
0

メソッド「-(IBAction)swichView」の後にaboutViewオブジェクトを保持しているようには見えません

「[self.view addSubview:aboutView.view];」という行

aboutView.viewに追加の参照カウントを与えますが、 aboutView自体には与えません。

おそらく、UIPopoverViewController の動作に似たデリゲート モデルを使用するでしょう。

次の行に沿ってメソッドを使用してプロトコルを定義します

-(void) subViewClosed:(AboutView*)aboutView;

親にそれを実装させてから、次のようにします。

-(IBAction)swichView {
    .. existing stuff ..

    (dont release)

    aboutView.delegate = self;
}

AboutViewクラス

-(IBAction)back {
    ... existing stuff ...

    [self.delegate subViewClosed:self];
}

-(void) subViewClosed:(AboutView*)aboutView{
    [aboutView release];
}
于 2012-04-11T05:12:57.003 に答える
0

ではswitchView、 のインスタンスを作成するべきではありませんAboutViewAboutView *aboutView関数のローカル変数ではなく、インスタンス変数として作成する必要があります。

ビューコントローラーアニメーションの設計により、アニメーション自体はコントローラーを保持せず、アニメーションが終了すると自動的に解放されます。あなたのコードは、アニメーション中にView Controllerの割り当てを解除するため、クラッシュします。

アニメーションの後にビューを適切に解放するには、次のことを試してください。

-(IBAction)switchView {
    // given that aboutView is an instance variable
    aboutView = [[AboutView alloc] init];
    [aboutView.view setAlpha:0];
    [self.view addSubview:aboutView.view];
    [UIView animationWithDuration:1.0 animations:^{
        [aboutView.view setAlpha:1];
    } completion:^(BOOL fin) {
        // don't release it
    }];
}

-(IBAction)back {
    [UIView animationWithDuration:1.0 animations:^{
        [aboutView.view setAlpha:0];
    } completion:^(BOOL fin) {
        [aboutView.view removeFromSuperview];
        [aboutView release];
    }];
}
于 2012-04-11T00:57:39.657 に答える