クラスのインスタンス化にnewを使う【ダークサイドObjective-C】


// Before
UILabel *label = [[[UILabel] alloc] init];
// After
UILabel *label = UILabel.new;

いずれも同じ意味です。newはalloc+init呼び出しの短縮メソッドです。またプロパティー呼び出しを行うことで[UILabel new]記法を回避し、UILabel.newというRuby風の記述を実現しています。

newクラスメソッド

newクラスメソッドは、先祖クラスであるNSObjectにて以下のようなイメージで実装されています。

@implementation NSObject
+ (id)new {
    return [[self alloc] init];
}
@end

これは意外と知られていないメソッドなのですが、newメソッド自体はOS X 10.1以前の時代からありました。

ちなみにGoogleのコーディングガイドラインには「メモリー管理やコードレビューがメンドイからnewは使うな」的なことが書かれてますね。今はARCの時代なので気にする必要は無いでしょう。

評価

メッセージ転送のコストが余計にかかるため、処理効率が求められる分野での利用はあまりオススメしません。ただ気にするほどのオーバーヘッドにはなりませんのでダークサイ度は★1つとしました。開発時はnewで書き、リリース時にalloc.initで置き換えるのも良いかもしれません。

ちなみに、私は[NSObject.alloc init]記法を愛用しています。理由はinitWith~系コンストラクタ呼び出しへの書き換えがし易くなるためです。


私「君は年々綺麗になっていくね」
Objective-C「そういうの要らないです」

広告