views:

260

answers:

1

This question follows on from a previous question, that has raised a further issue. What I am trying to understand is just when the pointers and object in this example are being created and what ultimately happens to them. I am still trying to get my head round this, so please excuse any false assumptions I may have made.

// MAIN
int main (int argc, const char * argv[]) {
    PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
    [newPlanet_01 setGeekName:@"StarWars"];
}

.

// CLASS
@interface PlanetClass : NSObject {
    NSString *geekName;
}

- (NSString*) geekName;
- (void) setGeekName:(NSString*)gName;
@end

.

// SETTER
- (void)setGeekName:(NSString *)gName {
    if (geekName != gName) {
        [geekName release];
        geekName = [gName copy];
    }
}

(A) ... When an instance of PlanetClass "newPlanet_01" is first created is the NSString instance variable object created, or just a pointer to a possible future object? If it is just a pointer what am I releasing later in the setter as its just a pointer, not a pointer to an object?

(B) ... In the above example "gName" is a pointer to the NSString object @"StarWars"?

(C) ... Next is the pointer geekName different from the gName (i.e. if geekName does not already point at @"StarWars")

(D) ... geekName release, what is released the first time the code is run, my understanding was that geekName is just a pointer to does not point to anything. Or does release just not release anything this first time?

(E) ... Finally geekName = [gName copy]; the newly released geekName is now assigned to point to a copy of gName, what happens to the original gName?

+2  A: 
  1. You're creating a pointer that is initialized to nil. If you're familiar with C or Java, then nil is basically the same thing as NULL or null -- it's effectively a pointer to nothing.
  2. Yes. @"StarWars" is called a "string literal". Think of a string literal as a "permanent" string that is stored by the program, and gName (in this case) is a pointer to the memory location of that string.
  3. Yep -- that line makes sure that the incoming gName is not the same as the object's geekName variable. Assume that check wasn't there, and gName and geekName pointed to the same string -- then the next line would release that string, which could make the next line invalid (it would be copying a released string -- very bad!).
  4. Assuming geekName is still nil, then yes, nothing is released; or rather, the release message is sent to the nil object, which does nothing with the message. (Unlike C or Java, in Objective-C, you can send messages to nil -- but all such messages are ignored, and nil is the return value from all such messages).
  5. You create a copy of gName in case gName is really an instance of an NSMutableString -- you don't want other code to mutate the string that you are treating as immutable. But what happens to the original object pointed to by gName? Well, it depends on what the caller does with it. It could be released, it could be retained, it could be passed to another object...you don't really know. In this particular case, since gName points to the string literal "StarWars", nothing happens to that object (since it's a string literal -- see above). And the pointer itself is only valid in the scope of this method, and goes away once the method returns.
mipadi
I have a question about 5/E. In this case, is that a memory leak? What happens to constant strings? How is the memory for them reclaimed?
Jergason
Many thanks, perfect. With regards to (5/E) I would guess that it just gets automatically destroyed (automatically) when it goes out of scope, but thats just a guess as I have been doing this for 8 days :)
fuzzygoat
It's not a memory leak. You don't reclaim memory from string constants -- they stick around for the duration of the program. For string constants, the code for creating them is emitted by the compiler (and thus is part of the executable binary) -- specifically, they're stored in an area known as the "data segment" of the binary (program instructions are stored in a "text segment"). So you don't have to worry about "freeing" or "leaking" string constants' memory. (This is at least true of C and C-derived languages like ObjC.)
mipadi
Have a read of the memory management and string programming guides (the 'creating strings' section is a good place to start). http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.htmlhttp://developer.apple.com/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html#//apple_ref/doc/uid/20000148
Benedict Cohen
Thanks Benedict, with just starting out I am still finding my feet with regards to where resources are on the web, many thanks for the pointer, I will grab the PDF version and take a look.
fuzzygoat