ARCによるメモリ解放のタイミングについて

ARC は、メモリ管理でこれまで手動で行っていた、

Retain

Release

Autorelease

を自動でコンパイラで行うようにさせる方式です。一定のルールに従う必要がありますが、メモリ管理に関する、Retain、Releaseを書かなくてよくなります。

というところまでは一応なんとなくですがわかりました。


しかし、色々と調べてみるとARCにすると


・retainとかreleaseができないので、開放タイミングが確証できない。


と、こちらのサイト→http://nex.xrea.jp/?s=1796


に書かれていました。


例えばARCを使わない場合だと、Aという画面からBと言う画面に画面遷移するとき、

View03Controller *vBc = [[View03Controlleralloc] init];


UINavigationController *navCon;

navCon = [[UINavigationControlleralloc] initWithRootViewController:vBc];

navCon.navigationBarHidden = YES;

[selfpresentModalViewController:navCon animated:YES];

[vBc release];


このように最後にリリースをして解放していましたが、ARCでは [v3c release];この部分がいりません。

となるとこのViewのメモリはどこでリリースされるのだろう?と思ったのです。


アプリが完全に終了したとき?画面遷移が終わったとき?


ARCをつかうと自分が解放したい場所でメモリの解放ができないようなのですが、メモリの解放はいつ、どのタイミングでされるのでしょうか?

ARC以前のように自分で「ここでリリース!」というのはやはりできないのでしょうか?

iPhone 4, iOS 5.1.1

投稿日 2012/12/03 07:35

返信
返信: 3

2012/12/03 20:51 ryuunosuke_sob への返信

遅くとも,操作によって動き出した一連の処理が終了して,次のイベントを待つ状態になった段階ではリリースされます。一般的にはそれ以前に,不要になった時点でリリースされるようです。ARCは使っていないし,特に調べてもいないので,詳しいことは判りませんが。

2012/12/04 03:29 ryuunosuke_sob への返信

関数やメソッドからreturnする直前か、autorelease、またはdeallocによって解放されます。

ようするにARCを使っていないときと、あまり変わりません。


ちなみに、

例えばARCを使わない場合だと、Aという画面からBと言う画面に画面遷移するとき、

View03Controller *vBc = [[View03Controlleralloc] init];


UINavigationController *navCon;

navCon = [[UINavigationControlleralloc] initWithRootViewController:vBc];

navCon.navigationBarHidden = YES;

[selfpresentModalViewController:navCon animated:YES];

[vBc release];


このように最後にリリースをして解放していましたが、ARCでは [v3c release];この部分がいりません。


このコードだと、releaseした時点で解放されません。

オブジェクトがどの時点で解放されるのかは、「参照カウント」によって管理しているので、プログラマがそれを管理することはないはずです。

2012/12/06 02:15 ryuunosuke_sob への返信

View03Controller *vBc = [[View03Controlleralloc] init];


UINavigationController *navCon;

navCon = [[UINavigationControlleralloc] initWithRootViewController:vBc];

navCon.navigationBarHidden = YES;

[selfpresentModalViewController:navCon animated:YES];

[vBc release];


このように最後にリリースをして解放していましたが、ARCでは [v3c release];この部分がいりません。



[v3C release] の v3C は、vBc のことですか?


メソッド内の自動変数 ( vBc 等 ) は、特に指定しなければ __strong で、その変数のスコープ ( メソッドから出るときや "{ }" のブロック ) から出るときに release されると思います。

例えば、

- (xxx)methodSomething {

{

XXXXObject *xxxxObject = [[XXXXObject alloc] init];

// いろいろな処理-1

}

// xxxxObject のスコープ外

// いろいろな処理-2

}

のようになっていれば、xxxxObject のスコープは "{ }" のブロック内なので、そのブロックから抜けるときに release されると思います。

上のコードでは、「いろいろな処理-2」の前に、release されるかと思います。

他にも、xxxxObject に nil や他のオブジェクトがセットされれば、古いオブジェクトは release されます。


( これ以降は、ARC に限らず、従来のコードによる retain, release でも同様です。)

ただし、メモリが開放されるのは dealloc されるときです。

release されても retainCount が一つ減るだけで、dealloc されるとは限りません。

他で retain されていれば開放されません。

また、どこかで retain & autorelease されていれば、autoreleasePool が開放されるまで開放されません。

( autoreleasePool は、イベントループの最後で開放されます。)


上のコードでは、

navCon = [[UINavigationControlleralloc]initWithRootViewController:vBc];

で、vBc は navCon に retain されているかと思いますので、navCon が有効な間は dealloc されません。

navCon が dealloc されれば、vBc も dealloc されると思います。( 他で retain されていなければ。)

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

ARCによるメモリ解放のタイミングについて

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。