0

こんにちは、iOS プログラミングを勉強しています

空のアプリケーションであるプロジェクトを作成しました

そして、xibファイルなしでテーブルビューコントローラーを作成しました。

そして、didFinishLaunchingWithOptionsにフォローコードを挿入しました

TableViewController *tvc = [[TableViewController alloc] init];
[self.window addSubView:tvc.view];
[tvc release];

下にスクロールすると、このコードがクラッシュしました。何故ですか?

このコードにコメントすると

[tvc release];

プログラムはクラッシュしません。

私は AppDelegate ファイルに dealloc を書きませんでした。

何故ですか??

allocでテーブルビューコントローラーを作成したと思います

したがって、保持カウントは 1 です。

サブビューをウィンドウに追加し、ビューコントローラーの保持カウントは2です。

だから私はテーブルビューコントローラを解放します

しかし、下にスクロールするとクラッシュします。

どうしてか分かりません..

お願い助けて

4

2 に答える 2

2

tvc.viewウィンドウのサブビューとして追加すると単純に保持されますが、それ自体tvc.viewは保持されませんtvc。本質的に、TableViewControllerインスタンスは呼び出すとすぐに無効になりますrelease。スクロールするとアプリがクラッシュします。おそらく、インスタンスがまたはまたは に関連付けられているその他のものTableViewControllerのデリゲートまたはデータソースとして構成されているためです。UITableViewUIScrollViewtvc.view

また、ビューを表示する方法は、推奨される方法ではないことに注意してください。実際には、インスタンスを呼び出しpresentModalViewController:たりpushViewController:、渡したりする必要がありTableViewControllerます。これにより、TableViewControllerが閉じられる/ポップされるまで保持されるため、releaseコード例のように安全に呼び出すことができます。

または、この設定は の一部として手動で行っているため、直接didFinishLaunchingWithOptions設定することもできますが、これもwindow.rootViewControllerあまりお勧めできません。XCode を使用すると、アプリのデフォルト/ルート ビュー コントローラーを指定でき、アプリの起動時に自動的に設定されます。

于 2012-04-12T03:55:46.140 に答える
0

実際には、ビューだけを追加しただけです。したがって、ビューだけが保持されます。ビューコントローラーが解放されます。ただし、ビューコントローラーはデータソースであり、テーブルビューのデリゲートである必要があります。割り当てが解除されているため、そのデータソースには有効な参照がなく、クラッシュします。

于 2012-04-12T03:54:30.237 に答える