2011-01-26 9 views
0

私はスプリットビューコントローラベースのアプリケーションを持っています。詳細ビューコントローラで、FirstViewControllerは、ユーザーがボタンを押したときに、私はSecondViewContorllerそれを呼び出す、新しいビューコントローラとビューコントローラを更新し、それを呼び出して、以下のようなもの:インサイド詳細ビューコントローラを解放するとメモリの問題が発生する

- (void) buttonPressed:(id)sender { 
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil; 

    SecondViewController *secondVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
    ... 
    detailViewController = secondVC; 

    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0]; 
    NSArray *viewControllers = [NSArray arrayWithObjects:nav, detailViewController, nil]; 
    self.splitViewController.viewControllers = viewControllers; 

... 

    [detailViewController release]; 

}

MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0]; 
NSArray *array = nav.viewControllers; 
// Retrieve the master view controller 
MasterViewController *masterVC = [array objectAtIndex:[array count] - 1]; 
[masterVC selectRowManually:[NSIndexPath indexPathForRow:0 inSection:0]]; 

と私は再びFirstViewControllerを初期化selectRowManually内側:

我々が持っているいくつかの点でSecondViewController、

私は(FirstViewControllerが再び表示された後)この時点で警告メモリをシミュレートした場合、私はライン385

#0  0x012dd057 in ___forwarding___ 
#1  0x012dcf22 in __forwarding_prep_0___ 
#2  0x00b49a55 in -[UIView dealloc] 
#3  0x00bbe52a in -[UIViewController setView:] 
#4  0x00bc0eec in -[UIViewController unloadViewForced:] 
#5  0x00bbcb0a in -[UIViewController unloadViewIfReloadable] 
#6  0x00bbc15b in -[UIViewController didReceiveMemoryWarning] 
#7  0x0006aec7 in -[SecondViewController didReceiveMemoryWarning] at SecondViewController.m:385 
... 

のスタックトレースを

-[UIView _invalidateSubviewCache]: message sent to deallocated instance ... 

を取得SecondViewControllerののbuttonPressedメソッド内で、私は私がリリース行をコメントした場合

[super didReceiveMemoryWarning]; 

ですdetailViewContorller、すべて正常に動作しますが、メモリがリークします。その行をそのまま残すと、メモリ警告が発生した場合、アプリがクラッシュします。

どうすればよいですか?

おかげで、 ミハイ

答えて

0

私はあなたの代わりにsecondVCのごdetailViewControllerをリリースするコードの最初のブロックについて興味が?あなたのsecondVCはメソッドの最後にリリースされていないためです。 SplitViewAppDelegateは分割ビューのルートビューの一部であるため、deallocメソッドでdetailViewControllerを解放する必要があります。

乾杯、助けてください。

+0

答えをありがとう。 detailViewControllerはそのメソッドに対してローカルです。 detailViewController = secondVCの後に、同じSecondViewControllerオブジェクトを指すので、detailViewControllerまたはsecondVCを解放しても差はありません。 –

+0

メモリのクラッシュは通常はcountですので、コントローラのdeallocメソッドをブレークポイントにしてNSLogを使って特定のオブジェクトの保持カウントを確認し、deallocが望ましくない呼び出しをしないようにしてください。 – Seyther

+0

私は、最初の2番目の詳細ビューコントローラから行くときのように、splitviewcontrollerのviewControllerを更新していないので、問題は私がSecondViewControllerからFirstViewControllerに戻る方法だと考えています。 –

関連する問題