2012-04-12 11 views
0

ハローがクラッシュし、なぜ私は知りません。このテーブルビューのコードは私が空のアプリケーション</p> <p>あるプロジェクトを、作成したと私はXIBファイルを使用せずにテーブルビューコントローラを作成し</p> <p>をプログラミングのiOSを勉強してい

と私がスクロールダウンすると、このコードがクラッシュしたdidFinishLaunchingWithOptions

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

にフォローコードを挿入します。何故ですか?

私はこのコードプログラムがクラッシュしない

[tvc release]; 

コメント。

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

なぜですか?私はそうカウントは1

で保持し、窓やテーブルビューコントローラにサブビューを追加アロケーション

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

がカウントは2

で保持ので、私はテーブルをリリースビューコントローラ

ただし、スクロールするとクラッシュします。 ..

+1

UIWindowのメインビューをwindow.rootViewControllerとして設定するのはカスタムです。サブビューとしてではありません。 – CodaFi

答えて

2

シンプルで、ウィンドウのサブビューとしてtvc.viewを追加すると、tvc.viewは保持されますが、tvcは保持されません。本質的にはreleaseを呼び出した直後にTableViewControllerインスタンスが無効になります。 TableViewControllerインスタンスがUITableViewまたはUIScrollViewまたはtvc.viewに関連付けられたその他のものの代理人またはデータソースとして設定されているため、おそらくスクロールするとアプリがクラッシュします。

ビューを表示する方法は、推奨される方法ではありません。実際にpresentModalViewController:またはpushViewController:に電話し、TableViewControllerインスタンスを渡す必要があります。これにより、TableViewControllerが終了/ポップされるまで保持され、releaseをコード例のように安全に呼び出すことができます。

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

+0

ありがとうございます。私はそれを持っている!! – MoonSoo

0

私を助けてください、なぜ私にはわからない

は実際にあなただけの一人でビューが追加されました。したがって、ビューのみが保持されます。 viewcontrollerがリリースされます。しかし、viewcontrollerは、データソースであり、tableviewの代理人である必要があります。割り当てが解除されているため、そのデータソースには有効な参照がなく、クラッシュします。

+0

お返事ありがとうございます – MoonSoo

関連する問題

 関連する問題