2012-10-24 62 views
0

Objective-C的代码片段最初张贴在这里:内存管理相关

https://codereview.stackexchange.com/questions/17818/objective-c-retain-release-snippet

难道是好到那里后呢? 关于如何使用Objective-C管理内存有三个问题。

我设法让我的应用程序按照预期的方式工作,遵循Apple文档,但我想确保它真的是一条非常好的路!

如果这个问题是这样就OK了,请随时复制/粘贴到此处,我也会链接到从CoreReview这个问题...

编辑:

这是对文本从代码审查现场原题:

下面是一些片断我编码,我想在我处理这样一些反馈:

我有一个实用工具类,作为一个单身,这为我提供了一个名为方法randomColor返回一个(UICo lor *):

-(UIColor*)randomColor 
{ 
    float l_fRandomRedColor = [[MathUtility instance] randomFloatNumberBetweenNumber:0.0f AndNumber:1.0f]; 
    float l_fRandomBlueColor = [[MathUtility instance] randomFloatNumberBetweenNumber:0.0f AndNumber:1.0f]; 
    float l_fRandomGreenColor = [[MathUtility instance] randomFloatNumberBetweenNumber:0.0f AndNumber:1.0f]; 

    return [UIColor colorWithRed:l_fRandomRedColor 
       green: l_fRandomGreenColor 
       blue: l_fRandomBlueColor 
         alpha: 255]; 
} 

现在,我知道这个方法返回的对象是autoreleased。

我返回的值存储在另一个类,我想保持这个值了一段时间,所以我继续这样的:

[self setMpCurrentPieceColor:[[GraphicsUtility instance] randomColor]]; 

其中要求以下属性:

- (void)setMpCurrentPieceColor:(UIColor*)_newColor 
{ 
    [_mpCurrentPieceColor release]; 
    [_newColor retain]; 

    // Make the new assignment. 
    _mpCurrentPieceColor = _newColor; 
} 

问题A)

我的实例变量在dealloc方法中被释放。是一个正确的路要走吗?

问题B)

现在,让我们想象我有一个数组,像这样:

UIColor* mBoardColors[WIDTH][HEIGHT]; 

我想以前的实例变量存入数组:

[mBoardColors[l_iBoardXIndex][l_iBoardYIndex] release]; 
[_color retain]; 
mBoardColors[l_iBoardXIndex][l_iBoardYIndex] = _color; 

是它正确吗?

问题C)

如果我想从一个细胞移动颜色到另一个(移动,不是抄袭),是正确的那样做?

[mBoardColors[l_iBoardXIndex][l_iBoardYIndex] release]; 
mBoardColors[l_iBoardXIndex][l_iBoardYIndex] = mBoardColors[l_iBoardXIndex][l_iBoardYIndex - 1]; 
mBoardColors[l_iBoardXIndex][l_iBoardYIndex - 1] = nil; 

在此先感谢您的宝贵意见和建议!

回答

1

这里去我的答案:

问题A)

我的实例变量被释放dealloc方法。是一个正确的路要走吗?

这是正确的,你伊娃在dealloc方法中发布。此外,你处理伊娃的方式:

[self setMpCurrentPieceColor:[[GraphicsUtility instance] randomColor]]; 

- (void)setMpCurrentPieceColor:(UIColor*)_newColor 
{ 
    [_mpCurrentPieceColor release]; 
    [_newColor retain]; 

    // Make the new assignment. 
    _mpCurrentPieceColor = _newColor; 
} 

是正确的:首先,你会得到一个自动释放的对象;你把它分配给您的类(_mpCurrentPieceColor)伊娃同时还保留并释放以前的对象,这是在那里。

在风格的角度来看,我不会_前缀你的参数的名字,因为它会得到很难分辨出哪是一个参数和伊娃。

同样,它不完全是你的场景(你创建一个新的对象,然后将它存储到伊娃),但原则上setMpCurrentPieceColor可以接收它已经存储的对象作为参数;在这种情况下,我会写:

- (void)setMpCurrentPieceColor:(UIColor*)newColor 
{ 
    if (newColor != _mpCurrentPieceColor) { 
    [_mpCurrentPieceColor release]; 
    [newColor retain]; 

    // Make the new assignment. 
    _mpCurrentPieceColor = newColor; 
    } 
} 

与同一对象都指向危险是,你首先release它(这可能在这个时候挑起的dealloc),然后retain一遍(但万一它已被释放,这将是灾难)。

至于你的B和C的问题,基本上你应该照顾同样观察如上:如果你保留,万一之前释放的对象恰好是同一个对象,你有麻烦了。其余的,你正确处理释放/保留。这将是更安全的retain ING之前和release -ing后。

+0

非常感谢您的回答! –