1

私は viewDidUnload と dealloc メソッドを扱っていますが、[super dealloc] を呼び出すときに問題が発生しました。親View Controllerで。

親View Controllerの外側に配置したカスタムコードを備えたView Controllerがたくさんあります。したがって、View Controller を定義するときに、スーパー クラスへの参照を設定します。

@interface LoginViewController : AbstractViewController

次に、dealloc メソッドで、AbstractViewController の dealloc メソッドを呼び出します。

//(Login View Controller code)
- (void)dealloc {
    [user release];
    [passwd release];
    [super dealloc];
}

[super dealloc] 次のコードを実行します。

//(Abstract View Controller code)
- (void)dealloc {
    [dbUtils release];
    [loadingView release];
    [super dealloc];
}

iPhone シミュレーターでメモリ警告をシミュレートすると、次の例外がスローされます。

2010-03-03 11:27:45.805 MyApp[71563:40b] Received simulated memory warning.
2010-03-03 11:27:45.808 MyApp[71563:40b] *** -[LoginViewController isViewLoaded]:     message sent to deallocated instance 0x13b51b0
kill
quit

ただし、AbstractViewController の [super dealloc] 行にコメントを付けると、例外はスローされず、アプリは引き続き実行されます。

もう一度助けてくれてありがとう!

4

3 に答える 3

2

View Controllerを解放しているようですが、もう一度使用しようとしています。メモリ警告のためにViewControllerを解放するときは、誤って再度使用しないように、ポインタをnilに設定することを忘れないでください。すなわちのようなもの

[myLoginViewController release]; //!< Triggers the dealloc call
myLoginController = nil; //!< Makes sure we never use it again

または、myLoginViewControllerがプロパティの場合、これをより適切に行うことができます。

self.myLoginViewController = nil;

お役に立てば幸いです。

サム

于 2010-03-03T11:31:24.793 に答える
1

-didReceiveMemoryWarning は -dealloc をトリガーせず、-viewDidUnload をトリガーすることに注意してください。したがって、コントローラーの最終的な保持が解放される原因となる何か間違ったことを行うのは、-viewDidUnload の実装であると思います。そのため、-dealloc が呼び出されます。-viewDidUnload で解放されたリテイン リサイクルが原因で、私のコードでこの問題が発生しました。

于 2010-09-01T20:53:20.353 に答える
0

これは私に起こり、理解するのにしばらく時間がかかりました。デリゲートの 1 つがメッセージを送信しようとしていました。これは、デリゲートが自己であり、強い参照であったためです。弱くしたら直ったようです。

于 2013-01-03T21:32:52.153 に答える