プログラムでオブジェクトを割り当てたら、それを解放する必要があります。int を作成する場合、free(myint) を呼び出す必要がありますか、それとも変数は関数の最後で自動的に破棄されますか? また、int、long、または bool プロパティをオブジェクトに追加した場合、dealloc で処理する必要がありますか? または、使用している関数が完了したときにそれらも破棄されますか?
3 に答える
int を作成する場合、free(myint) を呼び出す必要がありますか、それとも変数は関数の最後で自動的に破棄されますか?
それはあなたがそれを行う方法に依存します: プリミティブ型の自動変数は、スコープ外になると割り当てが解除されます:
if (a == b) {
int sum = 0;
sum = a + b;
NSLog(@"%d", sum);
}
malloc
またはを使用してプリミティブを割り当てる場合は、最後にcalloc
使用する必要がありますfree
(ただし、このようなプリミティブを使用する理由はわかりません)。
if (a == b) {
int *sumPtr = malloc(sizeof(int));
*sumPtr = a + b;
NSLog(@"%d", *sumPtr);
free(sumPtr);
}
オブジェクトにプリミティブ フィールドを追加する場合も同じ規則に従います。 in を使用する場合はmalloc
、 inを使用するinit
必要があります。それ以外の場合、値はオブジェクトの残りの部分と「インライン」で割り当てられ、個別の割り当て解除は必要ありません。free
dealloc
C のスーパーセットであるため、自動スタック変数のルールは同じです。したがって、関数で定義するint x;
と、スタック上にあるため、クリーンアップするために何もする必要がないことを意味します。のようなヒープ割り当ては、ある時点でクリーンアップするint *x = malloc(...);
必要があります。free(x);
これらのステップがオブジェクトの内部 (例えばinit
) で発生する場合、それは同じ考えです。フィールドはそのままにしておくことができますが、クラスのメソッドでint
割り当てを解除して割り当てを調整する必要があります。dealloc
メモリ管理の基本的な重要なポイント (より詳細な説明はありません)として、release
作成したすべてのオブジェクトをnew
、alloc
またはcopy
;として作成する必要があります。retain
または、現在のオブジェクトのカウンターを増やした後。
それ以外の場合は、メソッドの呼び出しについて心配する必要はrelease
なく、そうすべきではありません。クラッシュのリスクが高くなります。
(これは、ARC を使用しない場合のメモリ管理の大まかな基本にすぎません)
alloc(...);
またはmalloc(...);
;を使用して以前にプリミティブにメモリを割り当てた場合を除き、プリミティブについて心配する必要はありません。その場合free(...);
、それらの使用を終了した後に割り当てられたメモリを使用する必要があります。