LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-06

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 を付けても同じでした。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0