プールブロックを自動解放するようになったとき、メモリ管理に関するAppleのドキュメントを読んでいて、何か考えさせられました。
Any object sent an autorelease message inside the autorelease pool block is
released at the end of the block.
これを完全に理解しているかどうかはわかりません。自動解放プール ブロック内で作成されたオブジェクトは、いずれにせよブロックの最後に解放されます。それが寿命だからです。オブジェクトがブロックの最後に到達したときにオブジェクトが解放されるのに、なぜオブジェクトに autorelease を呼び出す必要があるのでしょうか?
より明確にするために、私が考えていることの例を挙げます。
@autoreleasepool {
MyObject *obj = [[MyObject alloc] init]; // no autorelease call here
/* use the object*/
//....
// in the end it should get deallocated because it's lifespan ends, right?
// so why do we need to call autorelease then?!
}
PS: ARC が処理してくれるので、ARC のおかげで一部のことを行う必要がない、などとは言わないでください。私はそれを十分に認識していますが、メモリ管理のメカニズムを理解するために、ARC をしばらく脇に置きたいと思います。