はいといいえ。文字列メモリを解放することになりますが、ガベージコレクションされた(メモリ管理されていない)環境でこれを実行した場合、解放ではなくドレインを使用してNSAutoreleasePoolオブジェクトをメモリに「リーク」します。この「リーク」は、NSAutoreleasePoolのインスタンスを、GCの下で強力なポインターを持たない他のオブジェクトと同様に「到達不能」にするだけであり、オブジェクトは、次にGCが実行されるときにクリーンアップされます-drain
。
ドレイン
ガベージコレクションされた環境では、最後のコレクション以降に割り当てられたメモリが現在のしきい値より大きい場合、ガベージコレクションをトリガーします。それ以外の場合はリリースとして動作します。...ガベージコレクションされた環境では、このメソッドは最終的にを呼び出しますobjc_collect_if_needed
。
それ以外の場合は、-release
GC以外での動作に似ています(はい)。他の人が述べたように、-release
GCの下では何もしないので、プールがGCの下で適切に機能することを確認する唯一の方法はを介して行われ-drain
、-drain
非GCの下でも非GCの下とまったく同じように-release
機能し、間違いなくその機能をより明確に通信します。上手。
「new、alloc、initで呼び出されたもの」には「init」を含めないでください(ただし「copy」を含めるべきです)。「init」はメモリを割り当てないため、オブジェクト(コンストラクタファッション)。割り当てられたオブジェクトを受け取り、関数がそのようにinitのみを呼び出した場合、それは解放されません。
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
これは、すでに開始したメモリよりも多くのメモリを消費しません(initがオブジェクトをインスタンス化しないと仮定しますが、とにかくそれらの責任はありません)。