Литералы NSNumber


Я очень новичок в Objective-C. Я знаю C и C++, но Objective-C имеет довольно кривую обучения. В любом случае, есть ли более короткий способ (возможно, с помощью какого-то литерала NSNumber, если таковой существует) написать следующее:

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];
5 4

5 ответов:

Да, просто используйте одну из многих вспомогательных функций, таких как numberWithInt::

[Tyler setArms:[NSNumber numberWithInt:1]];
Выражение [NSNumber numberWithInt:1] эквивалентно выражению [[[NSNumber alloc] initWithInt:1] autorelease], которое эквивалентно выражению [[[NSNumber alloc] autorelease] initWithInt:1]. Последнее выражение встречается крайне редко.

Начиная с Clang v3. 1 Теперь можно использовать литералы Objective-C.

NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned = @42U;    // equivalent to [NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong = @42L;        // equivalent to [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong = @42LL;   // equivalent to [NSNumber numberWithLongLong:42LL]

Итак, отвечая на ваш конкретный вопрос:

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];

Теперь можно записать как:

[Tyler setArms:@1];
Существуют также литералы для массивов и словарей, но они выходят за рамки этого вопроса.

Чтобы воспользоваться преимуществами литералов в Xcode, вам понадобится как минимум версия 4.4 (на момент написания статьи это только предварительный просмотр).

Примечание: инфраструктура LLVM-это проект с открытым исходным кодом, поэтому не из это зависит от NDA компании Apple.

Вам не нужно выделять и инициализировать, NSNumber предоставляет удобный метод для этого:

[Tyler setArms:[NSNumber numberWithInt:1]];

В Xcode 4.4 теперь есть литералы NSNumber:

  // integral literals.
  NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
  NSNumber *fortyTwoUnsigned = @42U;    // equivalent to [NSNumber numberWithUnsignedInt:42U]
  NSNumber *fortyTwoLong = @42L;        // equivalent to [NSNumber numberWithLong:42L]
  NSNumber *fortyTwoLongLong = @42LL;   // equivalent to [NSNumber numberWithLongLong:42LL]

  // floating point literals.
  NSNumber *piFloat = @3.141592654F;    // equivalent to [NSNumber numberWithFloat:3.141592654F]
  NSNumber *piDouble = @3.1415926535;   // equivalent to [NSNumber numberWithDouble:3.1415926535]

  // BOOL literals.
  NSNumber *yesNumber = @YES;           // equivalent to [NSNumber numberWithBool:YES]
  NSNumber *noNumber = @NO;             // equivalent to [NSNumber numberWithBool:NO]

Лучшие документы, которые я видел до сих пор, находятся всправочной странице llvm .

Две вещи в дополнение к предыдущим ответам, оба из которых являются правильными:

Во-первых, нам будет легче помочь, если вы будете следовать соглашениям об именовании Cocoa: переменные, включая указатели на объекты, должны начинаться со строчной буквы. Итак, "Тайлер" вместо "Тайлер". Классы и типы начинаются с прописных букв.

Во-вторых, вы никогда не будете автоматически запускать объект перед его инициализацией. Всегда сначала alloc, затем init, а затем делайте все, что вам нужно сделать, в том числе release или autorelease.