2012-03-01 8 views
0

私はこれを理解するために数日間試しましたが、私は間違ったやり方をしてしまったと感じています。IOSサブビューメモリリークの追加と削除

私はスワイプジェスチャーをとる単一のビューを持っています。スワイプでは、nibファイルからサブビューを作成しようとします。私は、サブビューを読み込んで、サブビューを削除することができますが、どこかで、ビューの割り当てや削除と関係しているメモリリークがあります。 @class settingsviewcontroller

settingsviewcontroller * settingsview

、その後 :私は私の2番目のビューを合成していますし、最初のビューの.hファイルで、私も持っている現在のビューの.mファイルで

@property settingsviewの非原子的な保持

下のコードでは、私はサブビューを割り当てています。 [settingsview release [しかし、それは私が悪いメモリエラーを取得すると、それなしで動作します。

コードの2番目の部分では、これはsettingsviewcontrollerのビューを削除する関数です。それは、ユーザーからの行動を取って、画面をアニメーション化し、それを削除しようとするか、少なくともそれも試みると思う。

- (IBAction)swiping:(id)sender { 
    //SettingsViewController *SettingsView = [[SettingsViewController alloc] init]; 

    settingsView = [[SettingsViewController alloc] init]; 

    CATransition *animation = [CATransition animation]; 
    [animation setDuration:0.5f]; 
    [animation setType:kCATransitionPush]; 
    [animation setSubtype:kCATransitionFromTop]; 
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

    [self.view addSubview:[settingsView view]]; 
    [[self.view layer] addAnimation:animation forKey:@"SwitchToView1"]; 

    [settingsView release]; 
} 



- (IBAction)rollOut:(id)sender { 
    UIView *currentView = self.view; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDidStopSelector:@selector(removeFromSuperview)]; 
    //[UIView setAnimationDidStopSelector:@selector(release)]; 
    [UIView setAnimationDuration:0.5f]; 
    currentView.transform = CGAffineTransformMakeTranslation(currentView.frame.origin.x, 480); 
    [UIView commitAnimations]; 
} 

私は、この中にいくつかの方向性を与えてください、私はあなたがちょうど正しい方向に私を指す場合はそれを行う方法を理解することができます。

答えて

4

[self.view addSubview:[settingsView view]];

このコードはsettingsViewを保持していませんが、 "settingsviewのビュー"は保持されません。あなたがどこかでsettingsViewを呼び出すと、settingsViewがリリースされました、あなたは悪いメモリエラーを持っています。

この「@プロパティーはsettingsviewの非原子的な保持」なので、[settingsView release]を置き換えることができます。 〜によってself.settingsView = nil;

+0

あなたが提案したように、self.settingsView = nilを設定しました。ビューがポップアップした後、何かをクリックするとすぐに、クラッシュと不良メモリが再び発生します。 ビューが表示されているときにメモリの割り当てが解除されているように見えるため、画面上に表示されているときにメモリが実際に存在しません。 – user1232840

+0

[UIView setAnimationDidStopSelector:@selector(removeFromSuperview)]; [UIView setAnimationDelegate:self.view]のように、setDelegateをself.viewに設定する必要があります。 – carl

+0

ありがとう、ちょうど1分前に書いて実際に解決しました [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationDone)]; 、次に を持つ[self.view removeFromSuperview]; animationDone関数の ですが、もっと短くなるので、ちょっと後で試してみましょう – user1232840