Why does this not work:
NSInteger temp = 20;
[userSettingsFromFile setObject:temp forKey:@"aTemp"];
but this does:
[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];
How can I use the NSInteger variable?
Why does this not work:
NSInteger temp = 20;
[userSettingsFromFile setObject:temp forKey:@"aTemp"];
but this does:
[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"];
How can I use the NSInteger variable?
NSInteger
isn't an object -- it's simply typecast to int
on 32-bit or long
on 64-bit. Since NSDictionary
can only store objects, you need to wrap the integer into an object before you can store it. Try this:
NSInteger temp = 20;
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp] forKey:@"aTemp"];
Whatever you pass through setObject has to be derived from NSObject. NSInteger is not, it's a simple int typedef. In your 2nd example you use NSString, which is derived from NSObject.
In order to store numbers in collections, you have to wrap them up in an NSNumber
instance.
double aDouble = 20.3d;
NSInteger anInt = 20;
NSNumber *aWrappedDouble = [NSNumber numberWithDouble:aDouble];
NSNumber *aWrappedInt = [NSNumber numberWithInteger:anInt];
NSArray *anArray = [NSArray arrayWithObjects:aWrappedDouble, aWrappedInt, nil];
Correction: Whatever is passed through setObject:
do not have to be derived from the NSObject
class, but it must conform to the NSObject
protocol, that defines retain
and release
.
It can be confusing, but classes and protocols have different name spaces. And there is a both a class and a protocol named NSObject
, the class NSObject
conforms to the protocol NSObject
. There is one more root class, the NSProxy
class that also conforms to the NSObject
protocol.
This is important, because otherwise proxies could not be used in collections and auto release pools, while still having a lightweight proxy root class.