【问题标题】:Trouble dealing with retain/release/autorelease and class variable处理保留/释放/自动释放和类变量的麻烦
【发布时间】:2012-10-10 21:55:56
【问题描述】:

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

问题 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];
}

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

我应该autorelease 吗?

问题 B:

现在在另一个类中获取对象时,像这样:

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

对吗?

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

【问题讨论】:

    标签: objective-c pointers memory-management retain


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答!我试试看!我会及时通知你!
    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢!我试试看!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多