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