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 mill
NSMutableArray
doesn't take primitive types.
The second option is correct.
As stated by the previous replies, you can only add objects (id
type) to container classes like NSArray
.
One class that can be helpful in this context is NSValue
, which serves as a container for non-object data types of C and objective-C. In addition to numerical data types, this can also contain structs and some objective-C primitive data types like NSRect
.
Look here for more details: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html
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)