モーダルビューを解除した後、親ビューは割り当て解除されますか?
-
13-09-2020 - |
質問
iPhoneアプリを書いています。ナビゲーションスタックのビューコントローラから[EditCreatorControllerという名前]、[BMSStringPickerControllerという名前]を表示しています。私はデータを最初のビューに渡し、そのビューを使ってモーダルビューを閉じるためにデータを渡すためのAppleのガイドラインに委任プロトコルなどを作成しました。私はモーダルコントローラから予想されるデータを取り戻し、それを故意に却下することができます。問題は、その時点で、私が元のビューコントローラを取るほとんどすべての行動が
のようなデバッガのエラーにつながります。- [EditCreatorController PerformSelecter:Inobject:WithObject:]:Deallocation Instance 0x3a647f0
または
- [EditCreatorController TableView:WillSecrectrowatIndexPath:]:割り当て除去インスタンスに送信されたメッセージ0x3C12C40
言い換えれば、モーダルビューが表示されている間に元のビューコントローラが蒸発しているようです。これは、2つのデリゲートコールバックのどれが呼び出されていても真実です。これは、モーダルビューを呼び出す親コントローラからのコードです。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 1) { // selection on creator type row
// create a string picker to choose new creator type from list
BMSStringPickerController *picker = [[BMSStringPickerController alloc] initWithNibName:@"BMSStringPickerController" bundle:nil];
picker.delegate = self;
picker.stringChoices = [NSArray arrayWithObjects:@"composer", @"lyricist", @"arranger", @"original artist", @"other", nil];
picker.currentChoice = creator.type;
picker.title = @"Creator Type";
// wrap it in a nav controller so we can get tile bar etc. (from VC prog guide p. 93)
UINavigationController *newNavigationController = [[UINavigationController alloc]
initWithRootViewController:picker];
[self.navigationController presentModalViewController:newNavigationController animated:YES];
[newNavigationController release];
[picker release];
}
}
.
そしてここでデリゲートコールバックがあります:
- (void)stringPickerController:(BMSStringPickerController *)picker didPickString:(NSString *)string {
NSLog(@"received string back: %@", string);
typeLabel.text = string; // only change the label for now; object only changes if done button pressed
[self.tableView reloadData];
[self dismissModalViewControllerAnimated:YES];
}
- (void)stringPickerControllerDidCancel:(BMSStringPickerController *)picker {
NSLog(@"picker cancelled");
[self dismissModalViewControllerAnimated:YES];
}
.
もう一つの奇妙なこと(おそらく手がかり)は、「受信文字列を返す」nslogメッセージを取得し、typelabel.textに割り当て(TypelabelはテーブルビューのラベルへのIboutlet)、そこには表示されません。テーブルがリロードされても。
誰かがいくつかのアイデアを持っていますか?
解決
delegate
のdealloc
のBMSStringPickerController
をリリースしますか?
他のヒント
あなたの問題を解決することはできませんが、私はピッカーに自分自身を閉じるように伝えることを提案します(代理の方法で)、レスポンダチェーンが免除を正しく処理できるようにする:
[picker dismissModalViewControllerAnimated:YES];
. メモリがある場合のデフォルトの動作警告は、表示されていないすべてのビューコントローラのビューをリリースです。そのため、モーダルビューコントローラにメモリ警告が発生した場合、その親ビューコントローラはそのビューをアンロードされている可能性があります。
これが起こると、View DidUnloadがView Controllerで呼び出され、保持している参照をリリースできるようにします。あなたが保持しなかった参照があるならば、それらはビューがアンロードされたときに無効になります。多分これはあなたの症例で起こっていますか?
UIViewControllerリファレンスメモリ管理詳細についてはUiviewControllerメソッド didreceiveivemorywarning:ビューが現在表示されていない場合はビューをリリースしてからViewDIDunloadを呼び出します。