Can anyone tell me if the NSString instance variable "planetName" needs to be allocated / released by me (as in the example below) or is that done when the class instance is created / allocated?
My understanding is that int and float don't need to be, but not sure about NSString & NSArray …
@interface PlanetClass : NSObject {
NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end
Like this …
- (id) init {
[super init];
planetName = [[NSString alloc] init];
return self;
}
- (void) dealloc {
[planetName release];
[super dealloc];
}
** ———————————- **
EDIT: EDIT: Here is another version
** ———————————- **
int main(int argc, const char *argv[]) {
// ** Allocated here
PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
NSString *newPlanetName = [NSString alloc] init];
// ** Set the instance variable pointer here
newPlanetName = @"Jupiter";
[newPlanet_01 setPlanetName:newPlanetName];
// ** Released here
[newPlanet_01 release];
return 0;
}
the init & dealloc methods would then be like this …
- (id) init {
[super init];
return self;
}
- (void) dealloc {
// Always release the current copy of planetName
// pointed to by the class instance.
[planetName release]
[super dealloc];
}
The setPlanetName method would look like this …
- (void)setPlanetName:(NSString *)newPlanetName {
if (planetName != newPlanetName) {
[planetName release];
planetName = [newPlanetName copy];
}
}
PS: I am not using properties or synthesize, I have not gotten that far yet.
cheers -gary-
Best Answer
You still have an issue with your new code.
In your main function, you release
newPlanetName
but this is a little wrong. YourPlanetClass
retained it with itssetPlanetName:
method, but yourPlanetClass
never releases it again unless the name of the planet changes. It should not be up to the caller ofsetPlanetName:
to keep hold of the string, it is your classes responsibility to deal with it appropriately.Your old
dealloc
method is correct. It should release the planet's name because yourPlanetClass
no longer needs it. Your main method should not release the planet's name because the string returned bystringWithString:
does not belong to you, and you give it toPlanetClass
to take care of.So, keep your old
dealloc
method, and remove the[newPlanetName release]
from the main function and you should be alright from there.As a shortcut, you can even call
[newPlanet_01 setPlanetName:@"Jupiter"]
and do away with thenewPlanetName
variable altogether in your main function.