Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding Integer To NSMutableArray

I couldn't find this anywhere, so I am asking just asking to make sure. And yes, I know its basic, but I figure I'd rather get that right before I make the mistake a million times:

If I do the following, does it cast the "0" to an NSNumber by default (if not, what Object type is it), or would I have to do the 2nd code?

(Or both of these could be wrong for what I'm trying to do. If so, let me know. They both compile so I am just wondering which one is "right" (or preferred) and why.)

Code 1:

NSMutableArray array = [[[NSMutableArray alloc] init]];
[array addObject: 0];

Code 2:

NSMutableArray array = [[NSMutableArray alloc] init];
[array addObject: [NSNumber numberWithInt: 0]];
like image 424
MrHappyAsthma Avatar asked May 07 '12 17:05

MrHappyAsthma


2 Answers

NSMutableArray doesn't take primitive types.

The second option is correct.

like image 96
Daniel Bidulock Avatar answered Nov 18 '22 07:11

Daniel Bidulock


You cannot put a primitive such as an int into an NSArray; you must construct an NSNumber instance to hold it.

If I do the following, does it cast the "0" to an NSNumber by default (if not, what Object type is it)

No casting takes place. It's not possible to simply "cast" a primitive into an object, and the primitive does not have an object type. Objects must be constructed by sending messages (except: see below), which happens at runtime; casting only has an effect during compilation.

The only reason this works is that you have chosen 0 to add to the array. This is the same value as nil, which stands for "no object". If you had chosen any other integer, you would have a crash on your hands when you ran the code, since the value would be used as a pointer to memory that doesn't hold a valid object.

Interestingly, though, starting with Clang 3.1 or Apple's LLVM 4.0,* there is some new syntatical sugar for creating objects from literals in code. We've always had literal NSStrings: @"Lichtenstein". With the new compiler, other objects can likewise be created using the @ character.

In this case, to create an NSNumber object from a literal integer, you can simply write:

[array addObject:@0];

*(not yet available in public Xcode)

like image 8
jscs Avatar answered Nov 18 '22 08:11

jscs