NSNumber Литералы - PullRequest
       6

NSNumber Литералы

4 голосов
/ 21 марта 2011

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

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

Ответы [ 5 ]

16 голосов
/ 20 июня 2012

Начиная с 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 - проект с открытым исходным кодом, поэтому none этого не подлежит NDA Apple.

6 голосов
/ 21 марта 2011

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

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

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

3 голосов
/ 27 июля 2012

В 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 .

3 голосов
/ 21 марта 2011

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

[Tyler setArms:[NSNumber numberWithInt:1]];
2 голосов
/ 21 марта 2011

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

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

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

...