私は客観的な c をほぼ 1 週間使用しており、主に c++ コーダーです。Apple のメモリ管理ガイドを読んだ後、C++ でのメモリ使用スタイルを目的の C に持ち込もうとしました... これらのシナリオを結論付けようとしました。これらの手順に従えば、メモリの間違いはないと思います。私が間違っている場合は、親切にお知らせください:)
個人的に言えば、自動解放を使用しないようにします。自動解放を使用すると、特定の自動解放プールが空になる前に、常に冗長なメモリが存在する可能性があります。release のみを使用します。これにより、アプリケーションが常に最小限のメモリを使用するようになります。
Apple が言うもう 1 つのことは、私自身の言葉で説明すると、次のとおりです。retain/alloc/copy を追加するたびに、どこかにリリースを追加する必要があります。
私が結論付けるすべてのシナリオは次のとおりです。
同じ関数内:オブジェクトの割り当て、使用、および解放
クラスのinit関数でオブジェクトを割り当て、クラスのdealloc関数でオブジェクトを解放する
ポインターを所有する必要がある場合は、クラスのメソッド (メソッド Aとしましょう) で入力ポインターを保持し、クラスのdealloc関数でポインターを解放する必要があります。
客観的なcでretainを使用するタイミングは、c/c++でmemcpyを使用するタイミングと同じであることがわかったので、 retainを「メモリ効率の良いコピー」と見なします
入力保持ポインターがメンバーポインター変数に設定される場合は、最初にメンバーポインターを解放する必要があります。したがって、case[3] では、クラスのinitのallocはメソッド Aのreleaseと対になり、メソッド Aの保持はdeallocのreleaseと対になります。
戻り値としてポインタを返します。正直なところ、C++ を使用するときは、そのようなことは決してしません。メンバー ポインターを返す場合は問題ありません。誰かが面倒を見てくれます:
-(UIButton*) getTheButton() { return theButton; }
しかし、ローカルに割り当てられたオブジェクトへのポインターを返すのは本当にひどいことです。
-(UIButton*) getTheButton() { UIButton* myButton = [[UIButton alloc] init]; return myButton; //TERRIBLE! }
その場合は autorelease を使用する必要があると言う人もいるかもしれませんが、これを使用してそのソリューションをバイパスしたいだけです: メンバー ポインターのみを返すか、ポインターを返さないか、指定された入力ポインターのみを操作します。
-void operateOnTheButton(UIButton* button) { [button release]; button = [[UIButton alloc] init]; }
したがって、上記のメモリ使用方法に従って問題が発生した場合は、お知らせください。
ありがとう