alloc+initよりも、new? | HMDT Blog

alloc+initよりも、new?


Objective-Cでインスタンス化といえば、alloc+init。もう指が覚えていて、何も意識せずに自動的に入力しちゃいます。

でも最近、いろんなソースコード見ると、newメソッドを使っているものが目につくような気がします。Stack Overflowのサンプルとか。Appleのサンプルコードでも、けっこう使われている。個人的な感覚としては、妙に気持ち悪い。やっぱりそこは、alloc+initだろ、おい。

感情的な事はさておいて、alloc+initの利点は様々なイニシャライザが使えるところですね。たとえば、NSStringだとinitWithFormat:とか、initWithBytes:length:encoding:とか。ズラズラと引数を並べていくのが、Objective-Cの伝統です。いちばん長いのは、あれでしょ。OS Xになるけど、NSBitmapImageRepの、

– (id)initWithBitmapDataPlanes:(unsigned char **)planes pixelsWide:(NSInteger)width pixelsHigh:(NSInteger)height bitsPerSample:(NSInteger)bps samplesPerPixel:(NSInteger)spp hasAlpha:(BOOL)alpha isPlanar:(BOOL)isPlanar colorSpaceName:(NSString *)colorSpaceNamebitmapFormat:(NSBitmapFormat)bitmapFormat bytesPerRow:(NSInteger)rowBytes bitsPerPixel:(NSInteger)pixelBits

 です。なげーよ。引数いくつだよ。エディタのコード補完がなければ、やってられませんね。

こんなイニシャライザメソッドですけど、ある程度流行はあって、最近のトレンドだとinit時に引数を付けないものが多いような気がします。とりあえずinitメソッドでインスタンス化して、その後で各種プロパティを設定していく、という使い方です。これはやっぱり、property構文が導入されたからなんでしょうね。あと、初期化後も可変のプロパティの場合は、プロパティのアクセッサメソッドから設定するのに一本化した方が実装もすっきりするでしょう。ARCでretainを気にしなくてもよくなった、っていうのも影響しているかな。

そう考えると、なるほどnewメソッドを使うのは理にかなっているな、と思いました。alloc+initがnewメソッド一発に置き換わるなら、それもありかと。あと、JavaやC++から移って来た人たちにとっては、やっぱりnewの文字は捨て難いのかもしれません。

とはいっても、自分で書くコードでは、やっぱりalloc+initにしちゃうよな。

  1. コメントはまだありません。

  1. トラックバックはまだありません。