2.0のARCについて学ぶObjective-C先のエントリで書いたように、かつてObjective-Cで挫折したのはメモリ管理の手法を身につけることができなかったからでした。今、Objective-Cに再挑戦中ですが、やっぱり従来の手動のメモリ管理の手法はよくわかりません(>_<)。Counting)という機構を利用することができるようになったことで、その苦渋から脱出できそうな気配です。いえ動作の基礎をキチンとおさえておかないと、ものがものだけに致命的な間違いに直結してしまいます。ARCがどのように機能するのか調べてみました。その1:ループ内で宣言された変数に対してどう動く?手始めに。次のようなコードを走らせてみます。0;}clangコマンドに-fobj-arcオプションをつけてコンパイルします。sample1.m実行結果。loop」の間でおこなわれていること。ループの過程1回ごとに破棄がおこなわれているようです。その2:ぢゃ、ループの外で変数を宣言したらどう動く?コードを次のように変更してみます。*sをループの外側で宣言するようにしてみました。sample2破棄の順番がsample1と変わりました。次のオブジェクトが初期化されてから前のオブジェクトが破棄されています。最後のオブジェクトは関数を抜けるときに破棄されています。これはつまり、新しいオブジェクトが初期化され、sに新しいオブジェクト(のポインタ)が代入され、その結果古いオブジェクトはどこからも参照されなくなったため破棄される、ということと思われます。関数から抜けるときに最後のオブジェクトが破棄されるのも、関数から抜けるときに変数sが破棄されて参照する変数がなくなり最後のオブジェクトが破棄される、ということだと思います。その3:ループの外の変数に代入したらどう動く?次はsample1を次のように書き換えます。ループの外に変数を用意し、ループの途中でオブジェクトをその変数に代入します。sample3予想通りNo.1のオブジェクトは関数が抜けるとき、つまり参照している変数がスコープから外れるときに破棄がおこなわれるようになりました。その4:ループを中断したらどう動く?さらにsample1を次のように書き換えます。continueとbreakでループを中断しています。sample4キチンと初期化と破棄がおこなわれるようです。その5:関数がオブジェクトを返したらどう動く?sample3をもとに次のように書き換えてみます。関数内で生成したオブジェクトを関数の戻り値として返却します。sample5返却されたNo.1のオブジェクトが破棄されなくなりました。返却する側の関数からすれば、オブジェクトを返すのでそれを破棄してはいけないのは当然のところ。受け取ったmain関数の側で変数に代入しているので、その変数が破棄されるとき(main関数から抜けるとき)にオブジェクトの破棄がおこるのかと想像したのですが、これは完全に外れました。関数からオブジェクトを受け取る場合、次のように書く必要があるようです。deallocating@autoreleasepoolのスコープから抜けるときに関数の戻り値で受け取ったオブジェクトが破棄されているのがわかります。その6:メソッドがオブジェクトを返したらどう動く?次のようなコードを試してみます。その5のように関数でなく、メソッドでオブジェクトを返しています。sample6この場合もオブジェクトは破棄されませんでした。オブジェクトを返すのが関数かメソッドかは関係なく、どうやら、あるスコープ内で生成がおこなわれているか否かで挙動が変わるようです。オブジェクトを返すクラスメソッドはライブラリ中に頻繁に出てきます。同じ動作をしながらオブジェクトを生成せず初期化をするメソッドというのも存在します。次の2つはどちらも文字列からNSStringのオブジェクトを生成して返すコードです。2これらのばあい、1ではコード内でオブジェクトを生成をしているので変数s1がスコープか外れた時点で参照カウンタが減るのに対し、2の場合はメソッド内でオブジェクトを生成しているので変数s2がスコープから外れても参照カウンタが減らないと想像できます。だいたいわかってきたけれど...ARCはスマートポインタとほぼ同じものを提供してくれるものかと勝手に想像していたのですが、どうやらそういうわけではなさそうです。このあたりはもう少し慣れが必要な気配です。(6)はてなブログをはじめよう!E_Mattsanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。