I have a problem understanding this code:
- (void)subnetMaskByNumberOfSubnetBits:(id)sender{
// ------- Sets the subnet mask when the user selects the number of bits
NSNumberFormatter *stringToNumber = [[NSNumberFormatter alloc] init];//TURN A STRING INTO A NUMBER
NSNumber *selectedAmountOfBits = [[NSNumber alloc] init];//CONTAINS THE SELECTED NUMBER OF BITS
selectedAmountOfBits = [stringToNumber numberFromString:[sender objectValueOfSelectedItem]];
[self changeSubnetMaskUsingNumberOfMaskBits:selectedAmountOfBits];
//RELEASE
[stringToNumber release];
[selectedAmountOfBits release];
}
I kept getting errors because of the fact that I released selectedAmountOfBits.
I initialized the object using alloc and init.
Why don’t I need to release it?
The problem is that you are assigning an object to selectedAmountOfBits twice.
allocates a new NSNumber object that you own and assigns it to
selectedAmountOfBits.assigns a new autoreleased object to
selectedAmountOfBits. This means that when you do[selectedAmountOfBits release], you are actually trying to release an object that you do not own. You are also leaking the original NSNumber that you created since you’ve lost any reference to it.The solution is to remove the alloc/init line, keep the autoreleased NSNumber, and get rid of the line where you release it. The final code should look like this: