Литералы NSNumber
Я очень новичок в Objective-C. Я знаю C и C++, но Objective-C имеет довольно кривую обучения. В любом случае, есть ли более короткий способ (возможно, с помощью какого-то литерала NSNumber, если таковой существует) написать следующее:
[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];
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.