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