0

簡単な質問ですが、簡単なものが欠けていることを願っています。わかりました。別のクラスへのポインタを保持するクラスがあります。MainMenuClassおよびNormalGameClass。MainMenuClassの内部では、次のことを行います。

 m_NormalGame = [[NormalGameMode alloc] initWithNibName:@"NormalGameMode" bundle:[NSBundle mainBundle]];
 m_NormalGame.delegate = self;
 [self presentModalViewController:m_NormalGame animated:YES];

さて、NormalGameClassのdealloc関数が呼び出されていないときはいつでも問題に最初に気づいたので、retainCount呼び出しをいくつか行いました。何らかの理由で、MainMenuのrelease関数に戻ると、retaincountは6になります。非常に混乱。NormalGameClassのviewDidLoadの後の最初の行の[selfretainCount]は4です。ここで何が起こっているのか誰かが知っていますか?NormalGameClassでallocを呼び出すのは一度だけですが、それでも6まで保持されますか?不思議なことに、それを超えることはありません。洞察をありがとう。

更新:物事をいじっていて、これが厄介であることがわかりました。MainMenuClassで、NormalGameを取り除く方法は次のとおりです。

[self dismissModalViewControllerAnimated:NO];
m_NormalGame.delegate = nil;
[m_NormalGame release];

現在、この設定では、NormalGameのdeallocが呼び出されることはありません。ただし、上記の投稿の直後に[m_NormalGame release]を呼び出すと、NormalGameのdeallocが2回呼び出されます。=/混乱してペイントしてください。

4

2 に答える 2

0

-dismissModalViewControllerAnimated:呼び出しは、却下が完了するまでViewControllerを解放しないと思います。コントローラの最初の-alloc/-initと-releaseのバランスをとる必要がありますが、-deallocメソッドがすぐに呼び出されることを期待しないでください。オブジェクトが自動解放された場合、実際には、実行ループの次の反復中に呼び出される可能性があります。

あなたのdeallocを解放するための2つの呼び出しがなければ呼び出されない、または単にすぐに呼び出されないということですか?

また、混乱と頭痛につながるだけなので、保持カウントを検査しないようにしてください。メモリ管理ルールに正しく従ってください。

于 2010-08-27T21:41:17.590 に答える
0

presentModalViewControllerは、渡されたView Controllerを保持するため、自動解放しない場合は、渡されたViewControllerを解放する必要があります。この場合、m_NormalGameをリリースする必要があります。

m_NormalGame = [[NormalGameMode alloc] initWithNibName:@"NormalGameMode" bundle:[NSBundle mainBundle]];
m_NormalGame.delegate = self;
[self presentModalViewController:m_NormalGame animated:YES];
**[m_NormalGame release];**
于 2010-08-28T00:42:42.297 に答える