MacOSX
Cocoa
Objectice-C

Objective-CのNSArrayリテラルはリテラルではない

More than 1 year has passed since last update.

NSArrayリテラルは

NSArray<NSNumber *> *array = @[@1, @2, @3, @4];

こういう奴です。

リテラルっていうと起動時に作られて終了するまで生きていると思ってしまいますが、NSArrayリテラルはそれが使われるときに都度作成されます。

- (BOOL)contins:(NSNumber *)number

{
NSArray<NSNumber *> *array = @[@1, @2, @3, @4];
return [array containsObject:number];
}

このコードのコンパイル後の疑似コードは以下のようになります。

- (BOOL)contins:(NSNumber *)number

{
NSNumber *numbers[4];
numbers[0] = [NSNumber numberWithInt:1];
numbers[1] = [NSNumber numberWithInt:2];
numbers[2] = [NSNumber numberWithInt:3];
numbers[3] = [NSNumber numberWithInt:4];

NSArray *array = [NSArray arrayWithObjects:numbers count:4];
return [array containsObject:number];
}

- contains:が呼ばれるたびにNSArrayが生成されます。

すごく無駄なので複数回使う場合は生成が1回限りになるように工夫しましょう。


ここまで書いて

NSArray *const array = @[@1, @2, @3, @4];

とするとどうなるか調べる必要があることに気付いた。

たぶん変わらないと思うが。

追記:

  const を付けても同じでした。