Tyler Crompton
Tyler Crompton

Reputation: 12652

NSNumber Literals

I am very new to Objective-C. I know C and C++ but Objective-C has quite the learning curve. Anyway, is there a shorter way (possibly by some kind of NSNumber literal if such exists) to write the following:

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

Upvotes: 4

Views: 11524

Answers (5)

drewish
drewish

Reputation: 9368

In Xcode 4.4 there are now NSNumber literals:

  // 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]

The best docs I've seen so far are in the llvm man page.

Upvotes: 3

Richard Stelling
Richard Stelling

Reputation: 25665

As of Clang v3.1 you can now use Objective-C 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]

So, answering your specific question:

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

Can now be written as:

[Tyler setArms:@1];

There are also literals for arrays and dictionaries, but they are beyond the scope of this question.

To take advantage of literals in Xcode you'll need at least version 4.4 (at the time of writing this is a preview only).

NB: LLVM is an open source project so none of this is subject to Apple's NDA.

Upvotes: 17

Caleb
Caleb

Reputation: 124997

Two things in addition to the previous responses, both of which are correct:

First, it'll be easier for us to help if you follow Cocoa naming conventions: variables, including object pointers, should start with a lower case letter. So, 'tyler' instead of 'Tyler'. Classes and types start with upper case letters.

Second, you'd never autorelease an object before you initialize it. Always alloc first, then init, and then do whatever else you need to do, including release or autorelease.

Upvotes: 2

paxdiablo
paxdiablo

Reputation: 881083

You don't have to allocate and initialise, NSNumber provides a convenience method to do that:

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

Upvotes: 3

Adam Rosenfield
Adam Rosenfield

Reputation: 400146

Yes, just use one of the many helper functions such as numberWithInt::

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

The expression [NSNumber numberWithInt:1] is equivalent to [[[NSNumber alloc] initWithInt:1] autorelease], which is equivalent to [[[NSNumber alloc] autorelease] initWithInt:1]. The latter expression is extremely uncommon.

Upvotes: 6

Related Questions