2

私はobjective-cが初めてで、ここからコードをダウンロードしました。第 10 章
xcodeプロジェクト ファイルを実行しました。10.01 CarPartsInit

私がはっきりしていないことの1つは、セッターメソッドのメモリ管理を行うことです

- (void) setEngine: (Engine *) newEngine
{
    [newEngine retain] 
    [engine release];
    engine = newEngine;
}

プログラムの最後にエンジンretainCountが0になるはずです。

私はいくつかを実行NSLogし、プログラムが終了すると... retainCountfor エンジンは 1 でした... 0 に行って解放する必要がありますか? それともこれはメモリリークですか?

4

5 に答える 5

4

保持カウントについて心配する必要はありません。あなたもそれらを見るべきではありません。それらはあまりにも紛らわしいです—それらは実際にはプライベートな実装の詳細です。適切な例:オブジェクトの保持カウントがゼロになることはありません。なんで?意味がないからです。保持カウントが0のオブジェクトは、割り当て解除されたオブジェクトであり、割り当て解除されたオブジェクトにメッセージを送信するのはバグです(1の古い値を報告するか、まったく異なるものを報告するか、プログラムをクラッシュさせる可能性があります) 。メモリ管理ガイドラインに従っていて、Instrumentsがリークを報告しない限り、問題ないと感じるはずです。

于 2010-06-22T02:48:58.813 に答える
3

プログラムが終了する前にすべてを解放する必要はありません。オペレーティング システムは、プログラムが使用したすべてのメモリを自動的に再利用します。

プログラムの実行中に存在するオブジェクトについて心配しないのが一般的です。何かを作成した後、それを解放する前に参照を失った場合にのみ、実際にメモリ リークが発生します。

注: 終了前にすべてのオブジェクトをクリーンアップしないと、プログラムが何らかの形で「間違っている」と主張する馬鹿に出くわす可能性があります。そういう人は無視して構いません。

于 2010-06-22T01:41:36.073 に答える
1

インスタンスが保持 (または割り当て) するものはすべて、dealloc で解放する必要があります。

-(void) dealloc {
  [engine release]; // no need to set to nil in dealloc
  [super dealloc];
}
于 2010-06-22T01:54:08.257 に答える
0

setEngineが何をすべきかを調べてみましょう。

  1. 誰かがnewEngineを渡し、あなたはそれを使いたいと思っています。したがって、それを「保持」する必要があります。
  2. あなたの車はおそらくすでにエンジンを持っています。だからあなたはそれを解放します。(リリースメッセージをnullに送信しても何も起こらないことに注意してください)
  3. 次に、渡された引数「newEngine」を車のプロパティ「engine」に割り当てます。終わり。

保持カウントの増減を確認したい場合は、メソッド「release」を上書きして何かを印刷します。しかし、スーパーのリリースを呼び出すことを忘れないでください。

于 2010-06-22T03:19:25.840 に答える
0

クラスを初期化すると、エンジンのメモリ カウントが 1 増加します (初期化するとします)。
セッターでは、新しい値を保持し、古い値を解放する必要があります (保持カウンターは新しい値で増加し、カウンターは減少して古い値を取り除きます)。そのため、retain-counter はまだ 1 です。

プログラムを閉じるときは、メモリ リークが発生しないように、dealloc 関数でエンジンも解放する必要があります。

メモリ リークを監視する優れた方法は、xcode で "Leaks" ツールを使用することです:
run -> Start with Performance Tool -> Leaks

他の方法は、「ビルドと分析」ツールを使用して潜在的なメモリ リークを見つけることです:
[ビルド] > [ビルドと分析]

私がこれで正しいことを願っています。私の目的の c は少し錆びています。

于 2010-06-22T12:24:28.687 に答える