I have this little code
NSMutableArray *myArray = [[NSMutableArray alloc] init];
NSNumber *myNumber = [NSNumber numberWithDouble:752.65];
[myArray addObject:myNumber];
With this code I store Objects inside an array. But now I have two objects independent from each other.
If I change myNumber after it's been added to the array the value inside the array does not change. How can I archive that? I tried to give a pointer only to the array but it did not work.
You cannot put a variable into an array, and that's what myNumber
is: a variable. A variable is a container, and so is an array; the difference is that a variable is not also an object*, like the array is, and you can only put objects into an array.
What you pass to addObject:
is not the variable myNumber
, but the object it contains. That's what you are adding to the array.
To add the variable instead of the object inside it, you would need to do addObject:&myNumber
, in order to pass a pointer to the variable itself. But this won't work, for two reasons:
There are three solutions that will work:
That last solution is, in my opinion, the correct one. I doubt you are managing only a list of numbers; more likely, you are showing the user a list of something that has the number as a property. Model this in your code, and everything becomes much simpler.
Your code after replacing the bare NSNumbers with model objects will be something like:
MyModelObject *myModelObject = [[[MyModelObject alloc] init] autorelease];
[myModelObject setNumber:[NSNumber numberWithDouble:42.0]];
[myArray addObject:myModelObject];
//Some time later, you decide to change the number.
[[myArray objectAtIndex:idx] setNumber:[NSNumber numberWithDouble:43.0]];
//Or:
for (MyModelObject *obj in myArray) {
[obj setNumber:1000.0];
}
*I mean Cocoa objects. The C language does call any pointer, int, etc. an “object”, but this is a different definition.
Your problem is that NSNumber objects are immutable; meaning that you cannot change their value. So in order to change a value you have to create a new NSNumber object. E.g:
myNumber = [NSNumber numberWithDouble:[myNumber doubleValue]+1.0]
Now, of course you have myNumber point to different object than the one you added to the array. So you have to update the array by replacing the changed NSNumber object:
[myArray replaceObjectAtIndex:0 withObject:myNumber]
Well, this leaves you with the problem that you have to store the index together with each NSNumber in order to be able to update the array. Which is incovenient if you want to pass the NSNumber object around and allow changing the value.
You could solve this problem by introducing a wrapper object that you wrap around NSNumber in order to allow transparent updates or you just could create your own class that handles your doubleValue (somewhat a mutable NSNumber class).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With