Autorelease自動リリースプールの使用
3000 ワード
ARCを使用して開発するが、コンパイラはコード構造に基づいてretain、release、autoreleaseを自動的に追加する.
MRCメモリ管理の原則:誰が申請し、誰がalloc/copy/retainに遭遇してもreleaseまたはautorelease を追加する必要があります.
autoreleaseはタグにすぎず、1つのautoreleaseオブジェクトが自分の役割ドメインを超えた後、彼に最も近いautorelease poolに追加され、poolが傾倒し始めると、プール内のすべてのオブジェクトにreleaseメソッドが送信され、pool内のすべてのオブジェクトが解放されることを示しています.
自動解放プールautorelease poolの解放はメッセージループに関係する
単純なメッセージループをシミュレート
メッセージループの実行プロセスアプリケーションのオープン->イベント発生(クリックなど)->イベントオブジェクトに変換->autorelease poolのオープン->処理コードを実行し、コードで生成された一時変数をpoolに置く->pool破棄->次のループ
メインスレッドのメッセージループプライマリ・スレッド内にはデフォルトでオープン・メッセージ・ループがあり、イベントがオープンしたときに自動リリース・プールを作成し、イベントが終了したときにリリース・プールを倒します.
ループに大量の一時変数を作成するサブスレッドで次に、ループ内の自動リリースプールを使用します:
ループ中に大量の一時オブジェクトNSStringが作成されており、メソッドが完了していない場合、作成されるたびにオブジェクトは解放されないので、自動リリースプールを使用して、ループが開始されるたびに一時変数NSStringをプールに入れ、ループが終了するたびにプールを倒し、NSString一時変数をリリースするたびにリリースします.
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一時変数をリリースするたびにリリースします.