いや、今更なんだけど。
むか〜し、C++などでオブジェクトのスマートポインタなどを実装したことがあったので、それに似たようなものだろうと、仕組みを詳しく理解しないまま進めていたのが仇に。
いや、前々から、なぜか自分でreleaseしなくても、勝手にメモリが解放されるオブジェクトがあったりしたので、気になっていて、そろそろ根本を理解しナイトとマズイなぁと思っていたのですが、纏まった時間が取れずに放置していました。
でも、この度、お盆休みがとれたので、ちゃんと学習してみました。
なるほどなるほど、autoreleaseとpool機能のせいだったんですね〜。
autoreleaseのオブジェクトは、所属するpoolの解放とともに一緒にreleaseされるんですね。
で、おせっかい?なことに、標準のNS*のオブジェクトで自生成系のメソッドが大抵autoreleaseであると。
いや、初めから理解していればおせっかいではなく、逆に便利だと感じるのかもしれないのですが、ちゃんとその仕組みを理解していないと、誰に消されたのか解らず嵌ります。autoreleaseなのを知らずに、文字列領域を確保しているはずだから解放しようとか思って、明示的にreleaseすると2重解放とか言われちゃいます。
自分で明示的に[[xxx alloc] init]したものは、poolと一緒にreleaseされることがないため、明示的にreleaseしないとメモりリークするのですが、[[[xxx alloc] init] autorelease]としておけば、自分で生成する場合でも纏めてpoolでポイできるんですね。
でも逆に、autoreleaseをかませたオブジェクトは、poolと一緒に破棄されるので、pool破棄後も利用するオブジェクトの場合は、参照先でのretainによる参照カウンタのアップが超重要になってきます。
理解すると単純な話。だけど、これを理解しないまま組むと、メモリリークやメモリ破壊しまくりですね。。。
「詳解Objective-C」の95ページから詳しく載っていました。。。
特にJavaやC#などで、ガーベージコレクションの楽チンさに慣れきった人は必読ですね!(笑)
0 件のコメント:
コメントを投稿