Andy M
Andy M

Reputation: 6065

Trouble dealing with retain/release/autorelease and class variable

I have some crash in a test application I'm creating and I'm pretty sure it comes from memory management. Here are three questions related to this problem :

Question A :

// Within singleton : GraphicsUtility
-(UIColor*)GetRandomColor
{
    float l_fRandomRedColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f];
    float l_fRandomBlueColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f];
    float l_fRandomGreenColor = [[MathUtility instance] GetRandomFloatNumberBetweenNumber:0.0f AndNumber:1.0f];

    return [UIColor colorWithRed:l_fRandomRedColor
                    green: l_fRandomGreenColor
                        blue: l_fRandomBlueColor
                        alpha: 255];
}

Now, I don't really know how to do to return a pointer to this object without reinventing the wheel. Since the method colorWithRed:green:blue:alpha doesnt alloc or create (new) anything, I don't think I should retain it.

Should I autorelease it ?

Question B :

Now when getting the object in another class, like this :

// Within class : Test.
// mpCurrentPieceColor is a class variable.
mpCurrentPieceColor = [[GraphicsUtility instance] GetRandomColor];

Since I'm storing a pointer to a UIColor object, do I need to retain it once more ?

So when changing my color, I should do that ?

// Within class : Test.
// mpCurrentPieceColor is a class variable.
[mpCurrentPieceColor release];
mpCurrentPieceColor = [[GraphicsUtility instance] GetRandomColor];
[mpCurrentPieceColor retain];

Seems totally wrong to me...

Question C :

Finally, In my dealloc method, I'm doing this :

// Within class : Test
-(void) dealloc
{
    // never forget to call [super dealloc]
    [super dealloc];

    [mpCurrentPieceColor release];
}

Is it correct ?

The "best" solution I've found (and also the worse :)) was to use retain at some places... I didn't crash anymore but, obviously, I ended up with memory leaks... Any help would be greatly appreciated ! Thanks !

Upvotes: 0

Views: 134

Answers (2)

Catfish_Man
Catfish_Man

Reputation: 41801

Questions A and B are somewhat confusing because you're not using the right method names. "get" has a special meaning in Cocoa, and is rarely used. You probably just want "randomColor" for the name. It should return an autoreleased object, but colorWithRed:green:blue:alpha does that, so other than the name that looks fine.

Give that you're returning an autoreleased object, you will need to retain the result, and release it when you're done with it.

Your dealloc is definitely not right. [super dealloc] will finish destroying the object. You can't then use pieces of the object (mpCurrentPieceColor) afterwards. You should always call [super dealloc] last, since it's the last step in destroying the object.

Upvotes: 1

Phillip Mills
Phillip Mills

Reputation: 31016

A: Don't autorelease. The method you're calling returns an autoreleased object; you're just acting as a pass-through.

B & C: These look mostly OK to me. Logically, your release of the color should probably be before the [super dealloc].

I'm not so sure what you mean by "class variable" though. Within a singleton, you could use mpCurrentPieceColor as a strong (or retained) property, access it with self.mpCurrentPieceColor and the release/retain around assigning would go away. (Of course, if you switch to ARC, the whole problem goes away.)

Another point is that the "Product->Analyze" menu option should be able to flag problems of this kind for you.

Upvotes: 2

Related Questions