0

我正在创建的测试应用程序中发生了一些崩溃,我很确定它来自内存管理。以下是与此问题相关的三个问题:

问题一:

// 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];
}

现在,我真的不知道如何在不重新发明轮子的情况下返回指向该对象的指针。由于该方法colorWithRed:green:blue:alpha不分配或创建(新)任何东西,我认为我不应该retain这样做。

autorelease应该吗?

问题乙:

现在在另一个类中获取对象时,如下所示:

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

由于我正在存储指向UIColor对象的指针,我是否需要再次保留它?

所以当改变我的颜色时,我应该这样做吗?

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

对我来说似乎完全错误......

问题 C:

最后,在我的dealloc方法中,我正在这样做:

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

    [mpCurrentPieceColor release];
}

这是对的吗 ?

我发现的“最佳”解决方案(也是更糟糕的:))是在某些地方使用保留......我没有再崩溃了,但显然,我最终出现了内存泄漏......任何帮助都是非常感激 !谢谢 !

4

2 回答 2

2

A:不要自动释放。您调用的方法返回一个自动释放的对象;你只是充当传递者。

B & C:这些对我来说看起来都还可以。从逻辑上讲,您发布的颜色可能应该在[super dealloc].

不过,我不太确定“类变量”是什么意思。在单例中,您可以将mpCurrentPieceColor其用作强(或保留)属性,使用它访问它,self.mpCurrentPieceColor并且分配周围的释放/保留将消失。(当然,如果你切换到 ARC,整个问题就会消失。)

另一点是“产品->分析”菜单选项应该能够为您标记此类问题。

于 2012-10-20T16:23:40.777 回答
1

问题 A 和 B 有点令人困惑,因为您没有使用正确的方法名称。“get”在 Cocoa 中有特殊的含义,很少使用。您可能只想要“randomColor”作为名称。它应该返回一个自动释放的对象,但是 colorWithRed:green:blue:alpha 会这样做,所以除了看起来不错的名称。

假设您要返回一个自动释放的对象,您将需要保留结果,并在完成后释放它。

你的 dealloc 肯定是不对的。[super dealloc] 将完成销毁对象。之后您就不能再使用对象的各个部分 (mpCurrentPieceColor)。你应该总是最后调用 [super dealloc],因为它是销毁对象的最后一步。

于 2012-10-20T16:24:02.320 回答