Adding Integer To NSMutableArray
Asked Answered
H

3

15

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]];
Highkeyed answered 7/5, 2012 at 17:39 Comment(0)
B
25

NSMutableArray doesn't take primitive types.

The second option is correct.

Byrle answered 7/5, 2012 at 17:40 Comment(3)
Okay cool. Thank you!! I'll flag this as the right answer soon (it says I have to wait 10 minutes to accept an answer to this question)Highkeyed
I'm happy I was able to help.Byrle
what id I have variable to addMarja
L
8

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)

Laverne answered 7/5, 2012 at 17:46 Comment(1)
still not yet available in public Xcode ?Lachrymatory
B
0

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

Bejarano answered 7/5, 2012 at 18:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.