// 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「そういうの要らないです」