Search code examples
objective-cpointersmemory-managementretain

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 !


Solution

  • 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.