2012-10-20 119 views
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吗?

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

这是对的吗 ?

我发现的“最好”解决方案(也是更糟:))是在某些地方使用保留......我没有崩溃了,但显然,我最终发生了内存泄漏......任何帮助将不胜感激 !谢谢 ! A:不要autorelease。

回答

2

答:不要autorelease。你正在调用的方法返回一个自动释放对象;你只是扮演传递角色。 C:这些看起来大多都可以。从逻辑上讲,您的颜色释放应该在[super dealloc]之前。

虽然我不太确定你的意思是“类变量”。在单身人士中,您可以使用mpCurrentPieceColor作为强大(或保留)的财产,使用self.mpCurrentPieceColor访问它,并且分配周围的发布/保留将消失。 (当然,如果切换到ARC,整个问题都会消失。)

另一点是“Product-> Analyze”菜单选项应该能够标记出这种类型的问题。

+0

谢谢你的回答!我会放手一搏!我会及时通知你的! –

1

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

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

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

+0

非常感谢!我会放手一搏! –