私はスプリットビューコントローラベースのアプリケーションを持っています。詳細ビューコントローラで、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、すべて正常に動作しますが、メモリがリークします。その行をそのまま残すと、メモリ警告が発生した場合、アプリがクラッシュします。
どうすればよいですか?
おかげで、 ミハイ
答えをありがとう。 detailViewControllerはそのメソッドに対してローカルです。 detailViewController = secondVCの後に、同じSecondViewControllerオブジェクトを指すので、detailViewControllerまたはsecondVCを解放しても差はありません。 –
メモリのクラッシュは通常はcountですので、コントローラのdeallocメソッドをブレークポイントにしてNSLogを使って特定のオブジェクトの保持カウントを確認し、deallocが望ましくない呼び出しをしないようにしてください。 – Seyther
私は、最初の2番目の詳細ビューコントローラから行くときのように、splitviewcontrollerのviewControllerを更新していないので、問題は私がSecondViewControllerからFirstViewControllerに戻る方法だと考えています。 –