Autorelease自動リリースプールの使用


ARCを使用して開発するが、コンパイラはコード構造に基づいてretain、release、autoreleaseを自動的に追加する.
MRCメモリ管理の原則:誰が申請し、誰がalloc/copy/retainに遭遇してもreleaseまたはautorelease を追加する必要があります.
autoreleaseはタグにすぎず、1つのautoreleaseオブジェクトが自分の役割ドメインを超えた後、彼に最も近いautorelease poolに追加され、poolが傾倒し始めると、プール内のすべてのオブジェクトにreleaseメソッドが送信され、pool内のすべてのオブジェクトが解放されることを示しています.
自動解放プールautorelease poolの解放はメッセージループに関係する
単純なメッセージループをシミュレート
void click(int type){
    printf(" %d 
"
,type); } int main(int argc, const char * argv[]) { @autoreleasepool { while (YES) { printf(" ,0 :"); int n; scanf("%d",&n); // if (n == 0) { printf("
"
); break; }else{ click(n); continue; } } } return 0; }

メッセージループの実行プロセスアプリケーションのオープン->イベント発生(クリックなど)->イベントオブジェクトに変換->autorelease poolのオープン->処理コードを実行し、コードで生成された一時変数をpoolに置く->pool破棄->次のループ
メインスレッドのメッセージループプライマリ・スレッド内にはデフォルトでオープン・メッセージ・ループがあり、イベントがオープンしたときに自動リリース・プールを作成し、イベントが終了したときにリリース・プールを倒します.

プールの使用シーンを自動的に解放する


ループに大量の一時変数を作成するサブスレッドで次に、ループ内の自動リリースプールを使用します:
for (int i = 0; i < largeNumber; ++i) {
@autoreleasepool{
    NSString *str = @"Hello World";
    str = [str stringByAppendingFormat:@" - %d", i];
    str = [str uppercaseString];
    NSLog(@"%@", str);
}
}

ループ中に大量の一時オブジェクトNSStringが作成されており、メソッドが完了していない場合、作成されるたびにオブジェクトは解放されないので、自動リリースプールを使用して、ループが開始されるたびに一時変数NSStringをプールに入れ、ループが終了するたびにプールを倒し、NSString一時変数をリリースするたびにリリースします.